代码之家  ›  专栏  ›  技术社区  ›  Vingtoft

使用管道的Python多进程无阻塞内部通信

  •  4
  • Vingtoft  · 技术社区  · 8 年前

    是否可以使用管道以非阻塞方式接收过程内部通信?

    考虑以下代码:

    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()
    

    这个 parent_conn.recv() 将阻止while循环,直到收到消息。有没有办法以非阻塞方式侦听消息?

    2 回复  |  直到 8 年前
        1
  •  7
  •   Paul Cornelius    8 年前

    使用轮询功能。如下更改while循环:

     while True:
           print('Test')
           if parent_conn.poll():
               msg = parent_conn.recv()
               if msg == 'Done':
                  break
           else:
               do_something_else()
    
        2
  •  2
  •   ivan_pozdeev RenanSS    8 年前

    根据 multiprocessing.Pipe() multiprocessing.Connection 文件,a Connection poll() 方法。