3

私は以下を含む少しソフトを設計しています:

  1. インターネット上のリソースを取得し、

  2. 一部のユーザー インタラクション (リソースのクイック編集)、

  3. 一部加工。

多くのリソースでこれを行いたいと思います (それらはすべてリストに記載されています)。それぞれが他から独立しています。編集部分はかなり疲れるので、ユーザー (おそらく私) が各リソースのダウンロードを待つ必要がないように、作業を楽にしたいと考えています。簡単にするために、ここでは 3 番目のタスクを忘れます。

私の考えは、threading または multiprocessing モジュールを使用することでした。一部のスレッド (スレッド 1 など) は事前に「ダウンロード」を実行し、別のスレッド (スレッド 2 など) は既にダウンロードされたリソースでユーザーと対話します。

質問: スレッド 1 が常に少なくとも ahead_min リソースよりも先にあり、最大で ahead_max (ahead_max>ahead_min) より先にあることを確認するにはどうすればよいですか?

通常、 Queue.Queue(ahead_max) (または multiprocessing.Queue(ahead_max)) に似たものが必要になりますが、 ahead_max に達した場合、キューに最大で ahead_min 要素が残るまで挿入がブロックされることを除いて (実際には、キューが空です。 http://docs.python.org/library/queue.html#module-Queueを参照してください)。ポッピングも、少なくとも ahead_min+1 要素がキューに入るまでブロックする必要があります (一連のリソースの最後にダミー オブジェクトを挿入して、最後のリソースも処理されるようにすることができます)。

何か案が?もっと簡単な代替案があれば、共有してください。

4

2 に答える 2

3

この場合Queue、独自のロジックをサブクラス化して実装することをお勧めします。クラスの実装Queue既に Python で行われているため、これは簡単な作業です。

これをテンプレートとして使用できます

from queue import Queue

class MyQueue(Queue):

    def put(self, item, block=True, timeout=None):
        ...

    def get(self, block=True, timeout=None):
        ...
于 2012-05-29T13:39:56.673 に答える
2

まず第一に、タスクは CPU バウンドよりも IO バウンドのように見えるため、この場合よりもthreading望ましいようです。multiprocessing次に、はい、異なる「モジュール」間の通信を設定するためにキューを利用します。デフォルトのpop動作では不十分な場合はQueue.qsize()、独自のロジックを試して実装できます。

于 2012-05-29T13:42:53.833 に答える