Python 进程间通信
进程通信的目的
- 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间
- 共享数据 多个进程想要操作共享数据,一个进程对共享数据
- 通知事 一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
- 资源共享 多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
- 进程控制 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
linux使用的进程间通信方式
- 管道(pipe),流管道(s_pipe)和有名管道(FIFO)
- 信号(signal)
- 消息队列( message queue )
- 共享内存( shared memory )
- 信号量( semophore )
- 套接字(socket)
各种通信方式的比较和优缺点
- 管道:速度慢,容量有限,只有父子进程能通讯
- FIFO:任何进程间都能通讯,但速度慢
- 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
- 信号量:不能传递复杂消息,只能用来同步
- 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
python 多进程 —— 进程间通信
multiprocessing.Queue()
以Queue为例,在父进程中创建两个子进程,一个往Queue
里写数据,一个从Queue
里读数据:
multiprcessing.Queue.put()
为 入队操作
multiprcessing.Queue.get()
为 出队操作
multiprocessing.Pipe()
Pipe()函数返回一对由管道连接的连接对象,默认情况下是双工(双向)。
Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等)。 请注意,如果两个进程(或线程)尝试同时读取或写入管道的同一端,管道中的数据可能会损坏。 当然,同时使用管道不同端的过程也不会有风险。