为什么这段Python队列代码会多次处理项目?

3 投票
1 回答
838 浏览
提问于 2025-04-15 20:09

下面是我创建的一个测试案例。为什么每个进程都打印出数字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这个包并不关心进程,它只适用于线程。在你的例子中发生了以下事情:

  1. 创建一个队列,并填入一些数字
  2. 分叉出4个进程。这会把内存中的内容复制到每个子进程里,包括已经填好的队列
  3. 每个进程都在清空自己那份队列的内容

你需要使用multiprocessing提供的Queue类。

撰写回答