Python队列和多进程队列:它们的行为如何?

34

这段示例代码有效(我可以在文件中写入内容):

from multiprocessing import Process, Queue

queue = Queue()
def _printer(self, queue):
    queue.put("hello world!!")

def _cmdDisp(self, queue):
    f = file("Cmd.log", "w")
    print >> f, queue.get()
    f.close()

不要使用这个错误样例:(errormsg: 'module' object is not callable),而使用另一个样例。

import Queue

queue = Queue()
def _printer(self, queue):
    queue.put("hello world!!")

def _cmdDisp(self, queue):
    f = file("Cmd.log", "w")
    print >> f, queue.get()
    f.close()

另一个示例无法将内容写入文件:

import Queue

queue = Queue.Queue()
def _printer(self, queue):
    queue.put("hello world!!")

def _cmdDisp(self, queue):
    f = file("Cmd.log", "w")
    print >> f, queue.get()
    f.close()

有人能解释一下它们之间的区别吗?还有正确使用的方法是什么?


3
一个小提示:你也可以像这样导入:"from Queue import Queue" - 这样你就能像第一次尝试一样调用Queue.Queue - "Queue()"。 - Bob
2个回答

76

对于你的第二个例子,你已经自己给出了解释——Queue是一个模块,无法被调用。

对于第三个例子:我假设你在使用 multiprocessing 时,同时使用了 Queue.Queue。一个 Queue.Queue 不会在进程之间共享。如果 Queue.Queue 在进程之前声明,则每个进程将接收一个副本,它与其他进程独立。在启动子进程之前由父进程放入 Queue.Queue 的项目将可供每个子进程使用。在启动子进程之后由父进程放入 Queue.Queue 的项目只能供父进程使用。Queue.Queue 用于不同线程内部(使用threading 模块)之间的数据交换。而 multiprocessing 队列用于不同 Python 进程之间的数据交换。虽然 API 看起来相似(是设计成这样),但基础机制根本不同。

  • multiprocessing 队列通过 pickling(序列化)对象并通过管道发送它们来交换数据。
  • Queue.Queue 使用共享数据结构和锁/互斥体来确保正确的行为。

15
由于这种行为,multiprocessing.Queue将产生您放入的副本,而queue.Queue将产生对您放入的内容的引用。 对我来说,从文档中完全无法理解这一点。 - Pelle

12

Queue.Queue

  • 适用于使用threading模块创建的并发环境。

  • 每个线程都共享对Queue.Queue对象的引用。此处不会发生数据复制或序列化,所有线程都可以访问队列内相同的数据。

multiprocessing.Queue

  • 适用于使用multiprocessing模块创建的并行环境。

  • 每个进程都可以访问multiprocessing.Queue对象的副本。通过pickle序列化将队列内容复制到各个进程中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接