14

マルチプロセッシングを使用して Python 2.6 (OSX) プログラムを作成しようとしています。キューにデフォルトの 32767 項目以上を入力したいと考えています。

from multiprocessing import Queue
Queue(2**15) # raises OSError

Queue(32767)正常に動作しますが、それ以上の数値 (例: Queue(32768)) は失敗しますOSError: [Errno 22] Invalid argument

この問題の回避策はありますか?

4

3 に答える 3

4

1 つのアプローチはmultiprocessing.Queue、カスタム クラスでラップすることです (プロデューサー側のみ、またはコンシューマーの観点からは透過的に)。それを使用して、ラップしているオブジェクトにディスパッチされるアイテムをキューに入れ、スペースが利用可能になったときにローカル キュー (Pythonオブジェクト)Queueから にのみフィードし、がいっぱいになったときにスロットルする例外処理を行います。list()multiprocess.QueueQueue

これは、コードの残りの部分への影響を最小限に抑える必要があるため、おそらく最も簡単な方法です。multiprocessing.Queueカスタム クラスは、基になるものを抽象化の背後に隠しながら、Queue のように動作する必要があります。

(1つのアプローチは、プロデューサーにスレッドを使用させることです。1つのスレッドは、スレッドからスレッドへのディスパッチを管理し、Queuemultiprocessing.Queueのスレッドは実際にはスレッドにフィードしますQueue)。

于 2011-05-05T18:40:26.517 に答える
2

私はすでに元の質問に答えましたが、Redisリストは非常に信頼性が高く、Python モジュールのそれらのサポートは Queue のようなオブジェクトを実装するのに非常に使いやすいと付け加えたいと思います。これらには、複数のプロセスだけでなく、複数のノード (ネットワーク全体) にスケールアウトできるという利点があります。

基本的にそれらを使用するには、キュー名のキー (文字列) を選択するだけで、プロデューサーにプッシュさせ、ワーカー (タスク コンシューマー) にそのキーからのポップをブロックするループを持たせます。

Redis BLPOP および BRPOP コマンドはすべて、キーのリスト (リスト/キュー) とオプションのタイムアウト値を取ります。タプル (キー、値) または None (タイムアウト時) を返します。そのため、おなじみのselect()の構造に非常によく似た(ただし、はるかに高いレベルの) イベント駆動型システムを簡単に作成できます。注意しなければならないのは、キーの欠落と無効なキー タイプだけです (もちろん、例外ハンドラでキュー操作をラップするだけです)。(共有Redisサーバーで他のアプリケーションが停止した場合、キーを削除するか、キューとして使用していたキーを文字列/整数または他のタイプの値に置き換えます...まあ、その時点で別の問題があります)。:)

このモデルのもう 1 つの利点は、Redis がそのデータをディスクに永続化することです。そのため、許可することを選択した場合、ワーク キューはシステムの再起動後も存続する可能性があります。

(もちろん、本当にそうしたいのであれば、単純な Queue を SQLlite やその他の SQL システムのテーブルとして実装することもできます。順序付けのためのある種の自動インクリメント インデックスと、各項目をマークするための列を使用するだけで、"完了" (消費); ただし、これには、Redis が「すぐに使える」ものを使用するよりも多少複雑になります)。

于 2011-12-21T09:34:21.697 に答える
-2

MacOSXで私のために働いています

>>> import Queue
>>> Queue.Queue(30000000)
<Queue.Queue instance at 0x1006035f0>
于 2011-05-05T16:25:39.153 に答える