1. 程式人生 > >multiprocessing.Queue()和queue.Queue()的區別

multiprocessing.Queue()和queue.Queue()的區別

1.from queue import Queue
這個是普通的佇列模式,類似於普通列表,先進先出模式,get方法會阻塞請求,直到有資料get出來為止

2.from multiprocessing.Queue import Queue(各子程序共有
這個是多程序併發的Queue佇列,用於解決多程序間的通訊問題。普通Queue實現不了。例如來跑多程序對一批IP列表進行運算,運算後的結果都存到Queue佇列裡面,這個就必須使用multiprocessing提供的Queue來實現

#child ---child process commucation
from multiprocessing import Process,Queue
import os,time,random

def write(q):
    for value in ['a','b','c']:
        print('put %s to queue..' % value)
        q.put(value)
        time.sleep(random.random())

def read(q):
    while True:
        if not q.empty():
            value = q.get()
            print('get %s from queue' % value)
            time.sleep(random.random())
        else:
            break
if __name__ == '__main__':
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    pw.start()
    pr.start()
    pw.join()
    pr.join()
    print('all datas have been writen and been read')

如果是用程序池,那麼就需要使用Manager().Queue()佇列才能在各子程序間通訊,否則沒用
 p = Pool()
    q = Manager().Queue()
    pw = p.apply_async(write,args=(q,))
    time.sleep(0.5)
    pr = p.apply_async(read,args=(q,))
    p.close()
    p.join()
    print('all datas have been writen and been read')

如果要在manger().Queue()中使用鎖,就要
manager = Manager()
    q = manager.Queue()
    lock = manager.Lock()   #鎖的獲取和釋放都一樣

參考自:https://my.oschina.net/yangyanxing/blog/296052