2009-05-29 124 views
16

此示例代码工程(我可以写在文件中的东西):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() 

,而不是这个其他样本不:(ERRORMSG:“模块”对象不是可调用的)

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

注意:你也可以像这样导入:“从队列导入队列” - 这样你就可以像第一次尝试一样调用Queue.Queue - “队列()” – Bob 2014-10-04 08:22:50

回答

46

对于第二个示例,您已经自己给出了说明--- Queue是一个模块,它不能被调用。

对于第三个示例:我假设您使用Queue.Queuemultiprocessing。一个Queue.Queue将不会在进程之间共享。如果在进程之前声明Queue.Queue,那么每个进程将收到它的副本,然后独立于其他进程。父母在开始孩子之前放置在Queue.Queue中的物品将会供每个孩子使用。家长在开始孩子后放置在Queue.Queue中的项目将仅供家长使用。 Queue.Queue用于在同一进程内使用不同的线程之间的数据交换(使用threading模块)。多处理队列用于在不同的Python 进程之间进行数据交换。虽然API看起来很相似(它的设计就是这样),但底层机制却有着根本的不同。

  • multiprocessing队列通过酸洗(序列化)对象交换数据并通过管道发送它们。
  • Queue.Queue使用线程与锁/互斥体之间共享的数据结构以实现正确的行为。
+3

由于这个行为是多处理的.Queue会产生你放入的内容的副本,而queue.Queue会产生你输入的内容的参考。 对我来说,这从文档中是完全不清楚的。 – Pelle 2016-07-01 08:38:45