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

12 篇文章 0 订阅
3 篇文章 0 订阅

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

  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')
    ################################################
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用multiprocessing模块创建进程来并行处理任务,同也可以使用该模块提供的Queue来实现多进程的数据共享和通信。下面是一个简单的例子,演示了如何在多个进程共享数据: ```python import multiprocessing def producer(queue): for i in range(10): queue.put(i) def consumer(queue): while True: item = queue.get() if item is None: break print(item) if __name__ == '__main__': queue = multiprocessing.Queue() p1 = multiprocessing.Process(target=producer, args=(queue,)) p2 = multiprocessing.Process(target=consumer, args=(queue,)) p1.start() p2.start() p1.join() queue.put(None) p2.join() ``` 在这个例子中,我们创建了一个Queue对象,并将其传递给两个进程。生产者进程通过put()方法将10个整数放入队列中,而消费者进程则不断地从队列中取出数据并打印。注意到我们在队列的末尾放了一个None对象,以此来告诉消费者进程已经没有数据可取了,可以结束了。 除了Queue之外,还可以使用multiprocessing模块提供的Pipe来实现进程的通信。Pipe函数返回一对连接对象,分别代表管道的两端。我们可以通过这些连接对象向管道中发送和接收数据。下面是一个例子: ```python import multiprocessing def child(conn): conn.send([42, None, 'hello']) conn.close() if __name__ == '__main__': parent_conn, child_conn = multiprocessing.Pipe() p = multiprocessing.Process(target=child, args=(child_conn,)) p.start() print(parent_conn.recv()) # prints "[42, None, 'hello']" p.join() ``` 在这个例子中,我们创建了两个进程管道,并将管道的一端传递给子进程。子进程通过send()方法管道中发送一个列表,包含一个整数、一个None对象和一个字符串。父进程则通过recv()方法管道中读取数据,打印出刚才子进程发送的列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值