python-11-队列,进程间、进程池间的通信

可以使⽤multiprocessing模块的Queue实现多进程之间的数据传递,
Queue本身是⼀个消息列队程序
因为进程之间相互不能影响
为了使进程间可以通信
队列便是完成进程间通信的任务
创建队列
放入队列的时候是放在队尾,取出队列的时候是从队首取

进程间的通信

    import multiprocessing
    import time
    
    def write_queue(queue1):
        i=0
        while True:
            i+=1
            if queue1.full():                        # 判断队列是否满
                print('队列已经满了')
                return
            queue1.put(i)
            print('写入了',i)
            time.sleep(0.5)                    #
    def read_queue(queue1):
        while True:
             if queue1.empty():                      # 判断队列是否空
                 print('队列已经空了')
                 return
    
             value=queue1.get()
             print('读取了:',value)
    if __name__ == '__main__':
        queue1=multiprocessing.Queue(5)
        p1=multiprocessing.Process(target=write_queue,args=(queue1,))
        p2=multiprocessing.Process(target=read_queue,args=(queue1,))
        p1.start()
        p1.join()                   #让p1先执行完再执行p2
        p2.start()

## 进程池间的通信

    import multiprocessing
    import time
    
    def write_queue(queue1):
        i=0
        while True:
            i+=1
            if queue1.full():
                print('队列已经满了')
                return
            queue1.put(i)
            print('写入了',i)
            time.sleep(0.5)
    def read_queue(queue1):
        while True:
             if queue1.empty():
                 print('队列已经空了')
                 return
    
             value=queue1.get()
             print('读取了:',value)
    if __name__ == '__main__':
        my_pool=multiprocessing.Pool(2)              #创建一个进程池,包含两个进程
        queue1=multiprocessing.Manager().Queue(5)    #创建一个进程池队列
    
        result=my_pool.apply_async(write_queue,(queue1,))     #进程池中使用异步的方式
        result.wait()                                         #让这个进程优先执行。同步方式下,不需要写。因为在此代码中,判断了队列空时退出,所以异步需要写,否则异步方式下无序运行,当读取读完了而写没有完成,读取就不执行了
        my_pool.apply_async(read_queue,(queue1,))     #进程池中使用异步的方式
        my_pool.close()                            #进程池不再接收新的任务。同步的时候不需要写,是因为异步无序,同步有序
        my_pool.join()                             #让主进程阻塞,主进程等待进程池执行完毕再结束。同步不需要写是因为当主进程发现一个进程结束后便立刻结束,而同步是按顺序来执行这两个进程的,执行完这两个进程后,主进程才发现并且结束;
                                                   # 而异步的时候,两个进程独立且无序,当一个进程完成后,主进程立刻发现并结束,此时还有一个进程没有执行完成,所以需要主进程等待进程池整体结束后再结束。


                                  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值