【问题标题】:multiprocessing.Pipe() vs .Queue()multiprocessing.Pipe() 与 .Queue()
【发布时间】: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


    【解决方案1】:

    它们是非常不同的东西,具有非常不同的行为。

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

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

    进程之间的数据传输通常使用这些Connection 对象:this 和shared-memory 是多处理代码中所有进程到进程通信的底层机制。 Queue 实例是更高级别的对象,最终需要使用Connection 来发送或接收表示正在通过队列传输的对象的字节流。所以从这个意义上说,它们做同样的事情——但这有点像说 USB 电缆与连接它们的东西做同样的事情。通常,您不想处理电线上的单个电压:发送或接收整个对象要好得多。 (这个类比有点弱,因为Connection 实例有sendrecv 以及send_bytesrecv_bytes,但它可能仍然有用。)

    【讨论】:

    • 谢谢!您能否扩展 process-safe 或向我指出该概念的一个很好的介绍性链接?我找不到任何给我完整的图片,到目前为止我只知道它与锁定有关。
    • “进程安全”是“线程安全”的进程变体。由于进程在很大程度上是相互隔离的(如果使用共享内存,共享内存除外——共享内存会引发所有线程问题),这归结为对共享文件描述符的操作,例如管道中的两个值对,影响另一个进程对同一个共享文件描述符的操作。对于线程安全——一个更大的问题——参见stackoverflow.com/q/261683/1256452
    • 作为一种过度概括,如果你在进程 A 和 B 之间创建一个半双工管道,然后从 A 发送到 B,或者是一个全双工管道,并确保永远不会出现这种情况其中B尝试发送给A A发送给B,反之亦然,并且你没有第三个进程C也发送给B,而A发送给B,你很漂亮安全。
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 2011-07-21
    • 1970-01-01
    • 2017-09-12
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多