【问题标题】:How do I choose between Pipe, Queue, Value, Array and Manager to communicate between processes?如何在管道、队列、值、数组和管理器之间进行选择以在进程之间进行通信?
【发布时间】:2013-06-06 06:08:37
【问题描述】:

在python中,它提供了很多模块多处理中进程之间的通信方式,PipeQueueValueArrayManager。哪一个是更好的选择?

【问题讨论】:

    标签: python process


    【解决方案1】:

    如果您想实现消息传递,请使用管道和队列。 如果要实现共享内存,请使用 Value 和 Array。 如果您想向多个进程公开面向对象的接口,请使用管理器。

    Pipe 适用于一对一通信或字节级协议:

    • 管道可以是双向的(“双工”)或单向的
    • 管道不是并发安全的:只有一个进程可以使用管道的同一端; 1对1通信好,否则需要加锁
    • 管道可以传输可选的 Python 对象或原始字节
    • 无法指定缓冲区大小

    Queue 类似于单向管道,但可能适用于多对多场景:

    • 队列是单向的:先进先出
    • 队列是并发安全的:多个进程可以使用队列的同一端;所以当有多个生产者或多个消费者时很好
    • 队列只能传输可选择的 Python 对象
    • 可以指定队列的最大大小
    • “无论何时使用队列,您都需要确保所有已放入队列的项目最终都会在加入进程之前被移除。”

    队列是使用管道和一些锁/信号量实现的。

    ValueArray

    • 提供对共享数据的同步访问
    • 仅适用于 C 数据类型 (ctypes)

    经理:

    • 可用于各种数据类型:它们返回的代理对象公开与底层(共享)对象相同的方法
    • 可以处理远程访问

    ValueArray 是共享内存的轻量级方法。根据我的经验,使用 SyncManagerAutoProxy can be huge 的开销。如果您可以使用ValueArray 解决您的问题,请使用它们。 SyncManager 可能有助于将面向对象的接口公开给多个进程,除非调用的频率不高。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      相关资源
      最近更新 更多