我构造了一个简单的示例脚本,它定义了multiprocessing
在 python 中使用的三个单独的进程。我的目标是让一个父线程产生两个较小的线程来收集和处理数据。
目前,我的实现如下所示:
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
显然,我开始我的两个线程的方式是阻塞的,因为在填充程序完成添加项目之前,消费者甚至不会开始处理队列中的项目。
我应该如何重写它以使两个线程立即开始而不是阻塞,因此消费者将在Empty
没有工作要处理的情况下简单地传递到 except 块,但在收到停止消息时会完全退出?
编辑:错字,start
和run
方法混淆了