不管是主进程和子进程间, 或者是两个子进程间, 两种情况的阻塞
- 单向通讯, 必须关闭管道的另外一个端口。, 防止一个端口阻塞另外一个接收。
- 即使单向通讯在接收的进程运行时, 也是阻塞发射端信息。解决后
接收端随时收到发射端信息, 而不必等发射端进程完成后再收到。
解决:
- 解决第一中情况, 正确代码:
from multiprocessing import Pipe,Process
def func(conn_a,conn_b):
conn_b.close() ##此处重点, 接收处关闭此处 的 b端
for i in range(5):
conn_a.send('儿子说:吃饱了')
conn_a.close()
if __name__ == '__main__':
conn_a, conn_b = Pipe()
Process(target=func,args = (conn_a,conn_b)).start()
conn_a.close() #此处重点, 接收处关闭此处 的 a端
while True:
try :
msg = conn_b.recv()
print(msg)
except EOFError:
conn_b.close()
break
- 解决第二种情况正确代码:
from multiprocessing import Process, Pipe
import time
def f(conn):
time.sleep(3)
conn.send('Done')
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
#================ 这段代码堵塞 ==================#
# while True:
# print('Test')
# msg = parent_conn.recv()
# if msg == 'Done':
# break
# print('The End')
# p.join()
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
########改用以下代码,即:加入.poll() 判断 ###########
while True:
print('Test')
if parent_conn.poll(): #这行为解决方法
msg = parent_conn.recv()
if msg == 'Done':
break
else:
print('ok')
################################################