multiprocessing.Pipe() 与 .Queue()

Ind*_*nus 6 queue multiprocessing python-3.x

import multiprocess as mp
Run Code Online (Sandbox Code Playgroud)

mp.Pipe()和 之间的主要区别是什么mp.Queue()?它们对我来说似乎是一样的:基本上Pipe.recv()相当于Queue.get(),Pipe.send()Queue.put()

tor*_*rek 7

它们是非常不同的事物,具有非常不同的行为。

\n\n

一个Queue实例put, get, empty,full其他方法。它有一个可选的最大尺寸(实际上是项目数量)。任何人都可以放入或进入任何队列。它是进程安全的,因为它处理所有锁定。

\n\n

函数\xe2\x80\x94注意这是一个函数,而不是类实例\xe2\x80\x94返回两个类型的对象(这些PipeConnection类实例)。这两个实例相互连接。它们之间的连接可以是单双工的,即您只能在一个上发送,而只能在另一个上接收,也可以是全双工的,即您在一个上实际发送的任何内容都会在另一个上接收。这两个对象具有sendrecvsend_bytes, recv_bytesfilenoclose方法等。发送和接收方法使用 pickling 代码在对象和字节之间进行转换,因为实际的数据传输是通过字节流进行的。连接对象锁定,因此不是进程安全的。

\n\n

进程之间的数据传输通常使用这些Connection对象:此对象和共享内存是多处理代码中所有进程间通信的底层机制。 Queue实例是更高级别的对象,最终需要使用 aConnection来发送或接收表示正在队列中传输的对象的字节流。因此,从这个意义上说,它们执行相同的操作\xe2\x80\x94,但这有点像说 USB 电缆与连接它们的设备执行相同的操作。通常,您不想处理电线上的单独电压:发送或接收整个对象要好得多。(这个类比有点弱,因为Connection实例有sendandrecv以及send_bytesand recv_bytes,但它可能仍然有帮助。)

\n

  • “进程安全”是“线程安全”的进程变体。由于进程在很大程度上是彼此隔离的(如果使用共享内存,则共享内存会引发所有线程问题),这归结为共享文件描述符上的操作(例如 Pipe 中的两个文件描述符)值对,影响另一个进程对同一共享文件描述符的操作。对于线程安全(一个更大的问题),请参阅 /sf/ask/18317841/。 (2认同)