python多进程-异步

python多进程异步
异步队列问题
进程池内部传递数据结构
有一个全局管理的Manager需要声明
异步调用必须使用这个SyncManager
单独开进程是同步的,所以不需要SyncManager

注: 队列的put方法和get方法都是阻塞的

import multiprocessing
import os, time, random

def worker(que,duilie=None):
    #pid=os.getpid()
    #duilie.put(pid)
    while True:
        print("开始执行,进程号为%d" % (os.getpid()))
        if que.full():
            print('队列满了----退出进程',os.getpid())
            break
        print('大小:',que.qsize())
        t_stop = random.randint(3, 5)
        time.sleep(t_stop)
        que.put(t_stop)
def gettext(que,):
    while True:
        if que.qsize()>0:
            time.sleep(1)
            print('消耗内容', que.get())
        else:
            time.sleep(2)
            print('等待-队列中的数量',que.qsize())

if __name__ == '__main__':
    ks=time.time()
    po = multiprocessing.Pool(5)  # 定义一个进程池,最 大进程数3
    que = multiprocessing.Manager().Queue(5)  # 申请队列
    duilie=multiprocessing.Manager().Queue(5)
    #lock=multiprocessing.Lock()#进程锁
    #num=multiprocessing.Value('d',1)#共享变量
    for i in range(4):
        po.apply_async(worker, args=(que,duilie))
    for i in range(1):
        po.apply_async(gettext,args=(que,))

    time.sleep(3)
    # while not duilie.empty():
    #     print(duilie.get())
    print("----start----")
    po.close()  # 关闭进程池,关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
    print("-----end-----")
    print(time.time()-ks)

你可能感兴趣的:(py基础)