在讲解多线程时,介绍了 3 种实现线程间通信的机制,同样 Python 也提供了多种实现进程间通信的机制,主要有以下 2 种: Python multiprocessing 模块下的 Queue 类,提供了多个进程之间实现
- Python multiprocessing 模块下的 Queue 类,提供了多个进程之间实现通信的诸多方法;
- Pipe,又被称为“管道”,常用于实现 2 个进程之间的通信,这 2 个进程分别位于管道的两端。
接下来将对以上 2 种方式的具体实现做详细的讲解。
Queue实现进程间通信
前面讲解了使用 Queue 模块中的 Queue 类实现线程间通信,但要实现进程间通信,需要使用 multiprocessing 模块中的 Queue 类。简单的理解 Queue 实现进程间通信的方式,就是使用了操作系统给开辟的一个队列空间,各个进程可以把数据放到该队列中,当然也可以从队列中把自己需要的信息取走。
Queue 类提供了诸多实现进程间通信的方法,表 1 罗列了常用的一些方法。
下面程序演示了如何使用 Queue 类实现多进程之间的通信。
import multiprocessing def processFun(queue,name): print(multiprocessing.current_process().pid,"进程放数据:",name) #将 name 放入队列 queue.put(name) if __name__ == '__main__': # 创建进程通信的Queue queue = multiprocessing.Queue() # 创建子进程 process = multiprocessing.Process(target=processFun, args=(queue,"http://c.biancheng.net/python/")) # 启动子进程 process.start() #该子进程必须先执行完毕 process.join() print(multiprocessing.current_process().pid,"取数据:") print(queue.get())程序执行结果为:
27100 进程放数据: http://c.biancheng.net/python/
24188 取数据:
http://c.biancheng.net/python/
Pipe实现进程间通信
Pipe 直译过来的意思是“管”或“管道”,该种实现多进程编程的方式,和实际生活中的管(管道)是非常类似的。通常情况下,管道有 2 个口,而 Pipe 也常用来实现 2 个进程之间的通信,这 2 个进程分别位于管道的两端,一端用来发送数据,另一端用来接收数据。使用 Pipe 实现进程通信,首先需要调用 multiprocessing.Pipe() 函数来创建一个管道。该函数的语法格式如下:
conn1, conn2 = multiprocessing.Pipe( [duplex=True] )
其中,conn1 和 conn2 分别用来接收 Pipe 函数返回的 2 个端口;duplex 参数默认为 True,表示该管道是双向的,即位于 2 个端口的进程既可以发送数据,也可以接受数据,而如果将 duplex 值设为 False,则表示管道是单向的,conn1 只能用来接收数据,而 conn2 只能用来发送数据。另外值得一提的是,conn1 和 conn2 都属于 PipeConnection 对象,它们还可以调用表 2 所示的这些方法。
下面程序演示了如何使用 Pipe 管道实现 2 个进程之间通信:
import multiprocessing def processFun(conn,name): print(multiprocessing.current_process().pid,"进程发送数据:",name) conn.send(name) if __name__ == '__main__': #创建管道 conn1,conn2 = multiprocessing.Pipe() # 创建子进程 process = multiprocessing.Process(target=processFun, args=(conn1,"http://c.biancheng.net/python/")) # 启动子进程 process.start() process.join() print(multiprocessing.current_process().pid,"接收数据:") print(conn2.recv())程序执行结果为:
28904 进程发送数据: http://c.biancheng.net/python/
28880 接收数据:
http://c.biancheng.net/python/