簡體   English   中英

python 具有無限循環的多進程隊列

[英]python multiprocess queue with infinity loop

I create 3 processes and want the function wirte1 to write value 'A,B,C' to queue1,and function read1 read value from queue1 and put it to queue2,in the same time, function read2 read value from queue2, but value B ,C 無法及時從 queue2 中讀取,處理完成。

from multiprocessing import Process, Queue,Manager,Pool,Lock
import os, time, random

#向隊列1寫數據
def write1(q1,lock):
    lock.acquire()
    for value in ['A', 'B', 'C']:
        print ('Put %s to queue111...%s' % (value,str(os.getpid())))
        q1.put(value)
        time.sleep(1)
    lock.release()

#從隊列1讀取數據並寫入隊列2
def read1(q1,q2,lock):
    lock.acquire()
    while True:
        time.sleep(1)
        value=q1.get()
        # if value is None:break
        print('Get %s from queue111.%s' % (value,str(os.getpid())))
        q2.put(value)
        print('Put %s to queue222...%s' % (value,str(os.getpid())))
    lock.release()

def read2(q2,lock):
    lock.acquire()
    while True:
        # if not q2.empty() or not q1.empty():
        time.sleep(2)
        value=q2.get(True)
        print('Get %s from queue222.%s' % (value,os.getpid()))
    lock.release()

if __name__=='__main__':
    manager = Manager()
    # 父進程創建Queue,並傳給各個子進程:
    q1 = manager.Queue()
    q2 = manager.Queue()
    lock1 = manager.Lock()
    lock2 = manager.Lock()
    lock3 = manager.Lock()
    start=time.time()
    p = Pool()
    # pw = p.apply_async(write1, args=(q1,lock1,))
    pw = Process(target=write1,args=(q1,lock1,))
    # time.sleep(0.5)
    # pr = p.apply_async(read1, args=(q1,q2,lock2,))
    # pr2 = p.apply_async(read2, args=(q2,lock3))
    pr=Process(target=read1,args=(q1,q2,lock2,))
    pr2 = Process(target=read2,args=(q2,lock3,))

    pw.start()
    pr.start()
    pr2.start()

    # p.close()
    # p.join()
    pw.join()
    pr.terminate()
    pr2.terminate()


    end=time.time()
    # print
    print('finished!!')
    print(end-start)

output 是: Put A to queue111...77678 Put B to queue111...77678 Get A from queue111.77680 Put A to queue222...77680 Put C to queue111...77678 Get A from queue222.77681 Get B from queue111.77680 Put B to queue222...77680 Get C from queue111.77680 Put C to queue222...77680 finished.! 3.025238275527954 Put A to queue111...77678 Put B to queue111...77678 Get A from queue111.77680 Put A to queue222...77680 Put C to queue111...77678 Get A from queue222.77681 Get B from queue111.77680 Put B to queue222...77680 Get C from queue111.77680 Put C to queue222...77680 finished.! 3.025238275527954

您不能使用terminate來控制這樣的系統:它與完成實際工作競爭 相反,使您的循環不是無限的,可能通過在每個Queue中使用一個哨兵值(如在一個注釋掉的行中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM