Python队列与多进程队列:它们是如何工作的?
这个示例代码可以正常工作(我可以在文件中写入内容):
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.Queue
和 multiprocessing
一起使用。一个 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的方式在进程之间复制。