为什么这段Python队列代码会多次处理项目?
下面是我创建的一个测试案例。为什么每个进程都打印出数字1到5,而这些数字没有在进程之间分配呢?
代码:
#!/usr/bin/python
from subprocess import *
from Queue import Queue
from Queue import Empty
import multiprocessing
from multiprocessing import Process
def main():
r = Runner()
r.run()
class Runner(object):
processes = []
def run(self):
q = Queue()
for t in range(1,6):
q.put(t)
for pi in range(1,4):
p = Process(target=self.runFromQueue, args=(q,))
p.start()
self.processes.append(p)
for p in self.processes:
p.join()
print "Finished!"
def runFromQueue(self, q):
try:
while True:
number = q.get_nowait()
print str(number)
q.task_done()
except Empty:
pass
if __name__ == "__main__":
main()
输出:
$ ./test_threads.py
1
2
3
4
5
1
1
2
3
2
4
3
5
4
5
Finished!
预期输出:
$ ./test_threads.py
1
2
3
4
5
Finished!
1 个回答
8
Queue这个包并不关心进程,它只适用于线程。在你的例子中发生了以下事情:
- 创建一个队列,并填入一些数字
- 分叉出4个进程。这会把内存中的内容复制到每个子进程里,包括已经填好的队列
- 每个进程都在清空自己那份队列的内容
你需要使用multiprocessing提供的Queue类。