データベース内のそれぞれのレコードと比較する必要がある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)
プロデューサー用のメソッドを用意することで、結果のバッチ処理を処理しますが、私はそれが好きではありません。消費者の責任です。
誰にもガイダンスはありますか?