为什么这个python队列代码多次处理项目?

时间:2010-03-08 12:08:47

标签: python queue multithreading

以下是我创建的测试用例。为什么每个进程都打印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 个答案:

答案 0 :(得分:8)

Queue包不是进程感知的,它只适用于线程。您的示例中会出现以下情况:

  1. 创建队列并填写数字
  2. 分叉4个进程。这会将内存内容复制到每个子进程中,包括填充的队列
  3. 每个进程清空其队列副本
  4. 您必须使用多处理提供的Queue类。