データベース内のそれぞれのレコードと比較する必要があるldapから多くのデータを読み込んでいます。SQL クエリの数を最小限に抑えるために、複数の LDAP レコードを 1 つのクエリにバッチ処理したいと考えています。
これはすべて非常に単純です。LDAP の結果を生成するスレッドと、それらの結果を使用して SQL クエリを実行するスレッドです。
ldap_results = Queue.Queue(10)
デフプロデューサー():
ldap_results() の結果:
ldap_results.put(結果)
デフ消費者():
バッファ = []
バッファサイズ = 5
True の間:
レコード = ldap_results.get()
buffer.append(レコード)
len(buffer) >= buffer_size の場合:
do_sql(バッファ)
バッファ = []
問題は次のとおりです。ldap が返す結果が 3 つだけで、結果buffer_sizeが 5 の場合、永久にブロックされてしまいます。None、 またはなどの特別なトークンをバッファに入れることができることは"EOF"わかっていますが、それは悪い設計のように思えます。
私は2つの代替案を思いつきました。1つ目は共有eof変数を持つことですが、それを適切に同期する方法がわかりません。
デフプロデューサー():
ながらデータ:
buffer.put()
eof = 真
デフ消費者():
eofではない間:
buffer.get()
2 つ目はProduceChunks(chunk_size)プロデューサー用のメソッドを用意することで、結果のバッチ処理を処理しますが、私はそれが好きではありません。消費者の責任です。
誰にもガイダンスはありますか?