1

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

誰にもガイダンスはありますか?

4

2 に答える 2

1

私は「走らせる、正しくする、速くする、シンプルにする」というパターンに従います。

特別な「EOF」トークンなしでこれを正しく実装できますか? そうでない場合は、EOF トークンを使用する必要があります。汗をかく必要はありません。はい、終了条件はより複雑ですが、現在は「正しい」です。

于 2008-11-12T03:19:43.547 に答える
0

「EOF」アプローチは完全に立派です。ANSI 文字列の縮図を見てみましょう。null は EOF です。それの何が悪いの?

あるいは、BSTR の縮図を見てみましょう。後続のヌルの代わりに、最初のバイトはバイトがどのように来るかを示します。

どちらでも構いません。

関係ない。

于 2008-11-12T03:16:47.610 に答える