【发布时间】:2019-05-24 03:01:54
【问题描述】:
import multiprocess as mp
mp.Pipe() 和 mp.Queue() 之间的主要区别是什么?它们对我来说似乎是一样的:基本上Pipe.recv() 相当于Queue.get(),而Pipe.send() 是Queue.put()。
【问题讨论】:
标签: python-3.x queue multiprocessing
import multiprocess as mp
mp.Pipe() 和 mp.Queue() 之间的主要区别是什么?它们对我来说似乎是一样的:基本上Pipe.recv() 相当于Queue.get(),而Pipe.send() 是Queue.put()。
【问题讨论】:
标签: python-3.x queue multiprocessing
它们是非常不同的东西,具有非常不同的行为。
Queue instance 有 put、get、empty、full 和其他各种方法。它有一个可选的最大尺寸(实际上是项目数)。任何人都可以放入或进入任何队列。它是进程安全的,因为它处理所有锁定。
Pipe function——请注意,这是一个函数,而不是类实例——返回两个 Connection 类型的对象(这些是类实例)。这两个实例相互连接。它们之间的连接可以是单双工的,即您只能在一个上发送而只能在另一个上接收,或者它可以是全双工的,即您实际发送的任何内容都会在另一个上接收。这两个对象具有send、recv、send_bytes,、recv_bytes、fileno 和close 等方法。发送和接收方法使用酸洗代码在对象和字节之间进行转换,因为实际的数据传输是通过字节流进行的。连接对象未锁定,因此非进程安全。
进程之间的数据传输通常使用这些Connection 对象:this 和shared-memory 是多处理代码中所有进程到进程通信的底层机制。 Queue 实例是更高级别的对象,最终需要使用Connection 来发送或接收表示正在通过队列传输的对象的字节流。所以从这个意义上说,它们做同样的事情——但这有点像说 USB 电缆与连接它们的东西做同样的事情。通常,您不想处理电线上的单个电压:发送或接收整个对象要好得多。 (这个类比有点弱,因为Connection 实例有send 和recv 以及send_bytes 和recv_bytes,但它可能仍然有用。)
【讨论】: