◎知识点
管道的概述
进程间通信之管道
◎脚本练习
▽ 管道的概述
"""
python中的管道有两种工作方式:
(1) 单向(半双工)
一端只能发送数据,另一端只能接收数据。
(2) 双向(全双工)
两端都既能发送数据又能接收数据,一端发送的数据只能由另一端接收。
标准库模块multiprocessing中提供了一个函数Pipe(),其返回值是一个元组,元组中包含两个对象,
分别表示管道两端的连接。
调用函数Pipe()时,如果不传入参数或传入的参数为True,管道的工作方式为双向(全双工);
如果传入的参数为False,管道的工作方式为单向(半双工),其中,对于返回的元组,第一个连接对象只能接收
数据,第二个连接对象只能发送数据。
对于管道两端的连接对象,主要有两个方法:
(1) send(self, obj)
用于将参数obj指定的对象发送到管道。
(2) recv(self)
用于从管道中接收对象。
"""
from multiprocessing import Pipe
conn1, conn2 = Pipe()
conn1.send('conn1第1次发送的数据')
conn1.send('conn1第2次发送的数据')
conn2.send('conn2第1次发送的数据')
conn2.send('conn2第2次发送的数据')
print(conn1.recv()) # conn2第1次发送的数据
print(conn1.recv()) # conn2第2次发送的数据
print(conn2.recv()) # conn1第1次发送的数据
print(conn2.recv()) # conn1第2次发送的数据
c1, c2 = Pipe(False)
c2.send('c2发送的数据')
print(c1.recv()) # c2发送的数据
# c1.send('c1发送的数据') # OSError: connection is read-only▽ 进程间通信之管道
"""
如果想要实现进程之间的通信,管道是常见的实现方式之一。
"""
from multiprocessing import Process, Pipe
import os, time, random
# 发送数据的子进程执行的代码
def send_data(conn):
print('发送数据的子进程%d启动' % os.getpid())
for obj in list(range(1, 10)):
print('发送数据:%s' % obj)
conn.send(obj)
time.sleep(random.random() * 3)
print('发送数据:None')
conn.send(None)
print('发送数据的子进程%d结束' % os.getpid())
# 接收数据的子进程执行的代码
def recv_data(conn):
print('接收数据的子进程%d启动' % os.getpid())
while True:
item = conn.recv()
if item is None:
print('接收数据:None')
break
print('接收数据:%s' % item)
time.sleep(random.random() * 3)
print('接收数据的子进程%d结束' % os.getpid())
if __name__ == '__main__':
print('父进程%d启动' % os.getpid())
cr, cs = Pipe(False)
ps = Process(target=send_data, args=(cs, ))
pr = Process(target=recv_data, args=(cr, ))
ps.start()
pr.start()
ps.join()
pr.join()
print('父进程%d结束' % os.getpid())◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_senior/pipe.py

