python队列和多处理队列:它们的行为方式如何?

DrF*_*k3n 25 python queue

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

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()
Run Code Online (Sandbox Code Playgroud)

而不是这个其他样本:( errormsg:'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()
Run Code Online (Sandbox Code Playgroud)

这个其他样本没有(我不能在文件中写一些东西):

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()
Run Code Online (Sandbox Code Playgroud)

有人可以解释这些差异吗?和权利?

Tor*_*rek 61

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

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

  • multiprocessing 队列通过酸洗(序列化)对象并通过管道发送它们来交换数据.
  • Queue.Queue 使用在线程和锁/互斥锁之间共享的数据结构以获得正确的行为.

  • 由于这种行为,multiprocessing.Queue将产生你所放入的内容的副本,而queue.Queue将产生对你所放入的内容的引用.对我来说,这在文档中完全不清楚. (6认同)

Red*_*war 12

队列.队列

  • 被创建为在该模块产生的并发环境threading中工作。

  • Queue.Queue每个线程共享对它们之间的对象的引用。这里不会发生数据的复制或序列化,并且所有线程都可以访问队列内的相同数据。

多处理队列

  • 被创建为在该模块产生的并行环境multiprocessing中工作。

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