Python进程池Pool中的Queue

本文探讨了Python中的进程池Pool如何与队列Queue配合使用,以实现异步和同步操作。在异步示例中,主线程启动并结束,而进程池在后台运行。同步部分展示了Queue在多进程间的通信,描述了其阻塞行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


========异步

#进程池中的Queue
'''
如果要用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue,
与multiprocessing中的Queue不同

'''
from multiprocessing import Manager,Pool
import os
def write(q):
    print('write启动')
    for ch in 'DONGGE':
        q.put(ch)

def read(q):
    print('read启动')
    while True:
        for i in range(6):
            print('read从write中获取:',q.get())

if __name__=='__main__':
    print('main Process(%s) start'%os.getpid())



    q=Manager().Queue()#Manager中的Queue才能配合Pool
    po = Pool()  # 无穷多进程

    #同步
    # po.apply(write,args=(q,))
    # po.apply(read,args=(q,))

    #异步,但是同时处理多进程的任务又使用同一个IO流输出会发生冲突,导致都没有输出数据
    po.apply_async(write,args=(q,))
    po.apply_async(read,args=(q,))

    po.close()#不允许进程池再加新的请求了
    print('main Process(%s) end' % os.getpid())




/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/apple/PycharmProjects/stage4/Pool/q_p.py
main Process(2558) start
main Process(2558) end

Process finished with exit code 0



========同步

#进程池中的Queue
'''
如果要用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue,
与multiprocessing中的Queue不同

'''
from multiprocessing import Manager,Pool
import os
def write(q):
    print('write启动')
    for ch in 'DONGGE':
        q.put(ch)

def read(q):
    print('read启动')
    while True:
        for i in range(6):
            print('read从write中获取:',q.get())

if __name__=='__main__':
    print('main Process(%s) start'%os.getpid())



    q=Manager().Queue()#Manager中的Queue才能配合Pool
    po = Pool()  # 无穷多进程

    #同步
    po.apply(write,args=(q,))
    po.apply(read,args=(q,))

    #异步,但是同时处理多进程的任务又使用同一个IO流输出会发生冲突,导致都没有输出数据
    # po.apply_async(write,args=(q,))
    # po.apply_async(read,args=(q,))

    po.close()#不允许进程池再加新的请求了
    print('main Process(%s) end' % os.getpid())




/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/apple/PycharmProjects/stage4/Pool/q_p.py
main Process(2647) start
write启动
read启动
read从write中获取: D
read从write中获取: O
read从write中获取: N
read从write中获取: G
read从write中获取: G

read从write中获取: E

===这里没有结束,还在阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值