multiprocessing
Pythonで使用する3つの別々のプロセスを定義する簡単なサンプルスクリプトを作成しました。私の目的は、データを収集して処理する2つの小さなスレッドを生成する1つの親スレッドを持つことです。
現在、私の実装は次のようになっています。
from Queue import Queue,Empty
from multiprocessing import Process
import time
import hashlib
class FillQueue(Process):
def __init__(self,q):
Process.__init__(self)
self.q = q
def run(self):
i = 0
while i is not 5:
print 'putting'
self.q.put('foo')
i+=1
self.q.put('|STOP|')
class ConsumeQueue(Process):
def __init__(self,q):
Process.__init__(self)
self.q = q
def run(self):
print 'Consume'
while True:
try:
value = self.q.get(False)
print value
if value == '|STOP|':
print 'done'
break;
except Empty:
print 'Nothing to process atm'
class Ripper(Process):
q = Queue()
def __init__(self):
self.fq = FillQueue(self.q)
self.cq = ConsumeQueue(self.q)
self.fq.daemon = True
self.cq.daemon = True
def run(self):
try:
self.fq.start()
self.cq.start()
except KeyboardInterrupt:
print 'exit'
if __name__ == '__main__':
r = Ripper()
r.start()
現在実行されているため、CLIのスクリプトからの出力は次のようになります。
putting
putting
putting
putting
putting
Consume
foo
foo
foo
foo
foo
|STOP|
done
明らかに、フィラーがアイテムの追加を完了するまで、コンシューマーはキュー内のアイテムの処理を開始しないため、2つのスレッドを開始する方法がブロックされています。
これを書き直して、両方のスレッドをブロックせずにすぐに開始するようにするにEmpty
は、処理する作業がないときにコンシューマーが単にexceptブロックに渡され、停止メッセージを受信すると完全に終了するようにするにはどうすればよいですか?
編集:タイプミス、start
とrun
メソッドが混同されていた