进程间通信

Posted by xiezg247 on August 2, 2015

Python 进程间通信

进程通信的目的


  • 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间
  • 共享数据 多个进程想要操作共享数据,一个进程对共享数据
  • 通知事 一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
  • 资源共享 多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
  • 进程控制 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

linux使用的进程间通信方式


  1. 管道(pipe),流管道(s_pipe)和有名管道(FIFO)
  2. 信号(signal)
  3. 消息队列( message queue )
  4. 共享内存( shared memory )
  5. 信号量( semophore )
  6. 套接字(socket)

各种通信方式的比较和优缺点

  1. 管道:速度慢,容量有限,只有父子进程能通讯
  2. FIFO:任何进程间都能通讯,但速度慢
  3. 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
  4. 信号量:不能传递复杂消息,只能用来同步
  5. 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

python 多进程 —— 进程间通信

multiprocessing.Queue()

以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

multiprcessing.Queue.put() 为 入队操作

multiprcessing.Queue.get() 为 出队操作

multiprocessing.Pipe()

Pipe()函数返回一对由管道连接的连接对象,默认情况下是双工(双向)。

Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等)。 请注意,如果两个进程(或线程)尝试同时读取或写入管道的同一端,管道中的数据可能会损坏。 当然,同时使用管道不同端的过程也不会有风险。