Python队列与多进程队列:它们是如何工作的?

34 投票
2 回答
18586 浏览
提问于 2025-04-15 11:54

这个示例代码可以正常工作(我可以在文件中写入内容):

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()

但是这个其他示例就不行了:(错误信息:'module'对象不可调用)

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()

有人能解释一下这些之间的区别吗?应该怎么做才对呢?

2 个回答

76

对于你的第二个例子,你自己已经解释得很清楚了——Queue 是一个模块,不能直接调用。

至于第三个例子:我猜你是把 Queue.Queuemultiprocessing 一起使用。一个 Queue.Queue 在不同的进程之间是不能共享的。如果在进程创建之前就声明了 Queue.Queue,那么每个进程都会得到它的一个副本,这样每个进程之间就互不影响。父进程在启动子进程之前放入 Queue.Queue 的数据,子进程都能看到。但如果父进程在启动子进程之后再放数据,只有父进程能看到。Queue.Queue 是为了在同一个进程里的不同线程之间交换数据(使用threading模块)。而多进程队列则是为了在不同的Python进程之间交换数据。虽然它们的接口看起来很相似(就是为了这样设计的),但底层的机制是完全不同的。

  • multiprocessing 队列通过对对象进行序列化(也就是把对象转成可以存储或传输的格式)并通过管道发送数据来交换信息。
  • Queue.Queue 使用的是一种在线程之间共享的数据结构,并且使用锁或互斥量来确保正确的行为。
12

Queue.Queue

  • 这个队列是为了在并发环境中使用而创建的,主要是和threading模块一起用。

  • 每个线程都可以共享同一个Queue.Queue对象。这里不会复制数据,也不需要把数据变成其他格式,所有线程都能访问队列里的同一份数据。

multiprocessing.Queue

  • 这个队列是为了在并行环境中使用而创建的,主要是和multiprocessing模块一起用。

  • 每个进程都能访问到一个multiprocessing.Queue对象的副本。队列里的内容会通过一种叫做pickle的方式在进程之间复制。

撰写回答