python multiprocessing 进程间通讯,使用管道(Pipe)时阻塞(BLOCKING)的解决方法

不管是主进程和子进程间, 或者是两个子进程间, 两种情况的阻塞

  1. 单向通讯, 必须关闭管道的另外一个端口。, 防止一个端口阻塞另外一个接收。
  2. 即使单向通讯在接收的进程运行时, 也是阻塞发射端信息。解决后
    接收端随时收到发射端信息, 而不必等发射端进程完成后再收到。

解决:

  1. 解决第一中情况, 正确代码:
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
  1. 解决第二种情况正确代码:
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')
    ################################################

你可能感兴趣的:(general,AI,Program,python)