如何在管道,队列,值,数组和管理器之间进行选择以在进程之间进行通信?

时间:2013-06-06 06:08:37

标签: python process

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

ValueArray

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

管理者:

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

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

相关问题