標籤:ror 接收 from empty ext range __name__ 模式 erro
執行個體1:訊息佇列Queue,不要將檔案命名為“queue.py”,否則會報異常“ImportError: cannot import name 'Queue'”
#coding=utf-8from multiprocessing import Queue q = Queue(3)#初始化一個Queue對象,最多可接收三條put訊息q.put('message-1')q.put('message-2')print(q.full())#False,是否滿了q.put('message-3')print(q.full())#True#因為訊息佇列已滿,下面的try都會拋出異常,第一個try會等待2秒後再拋出異常,第二個try會立即拋出異常try:q.put('message-4',True,2)except:print('except1,訊息佇列已滿,現有訊息數量:%s'%q.qsize())try:q.put_nowait('message-4')except:print('except2,訊息佇列已滿,現有訊息數量:%s'%q.qsize())#判斷隊列是否已滿if not q.full():q.put_nowait('message-4')#讀取訊息時,先判斷訊息佇列是否為空白,在讀取if not q.empty():for i in range(q.qsize()):print(q.get())#q.get會阻塞,q.get_nowait()不阻塞,但會拋異常
False
True
except1,訊息佇列已滿,現有訊息數量:3
except2,訊息佇列已滿,現有訊息數量:3
message-1
message-2
message-3
執行個體二:通過Process處理序間通訊
from multiprocessing import Process,Queueimport 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(True)print('Get %s from queue...'%value)time.sleep(random.random())else:breakif __name__ == '__main__':print('start...')q = Queue()#父進程的queue傳遞給子進程pw = Process(target=write,args=(q,))pr = Process(target=read,args=(q,))#寫進程pw.start()pw.join()#讀進程pr.start()pr.join()print('done...')
start...
Put A to queue...
Put B to queue...
Put C to queue...
Get A from queue...
Get B from queue...
Get C from queue...
done...
執行個體三:通過Manager處理序間通訊
from multiprocessing import Manager,Poolimport os,time,random #寫資料def writer(q):print('writer啟動(%s),父進程為(%s)'%(os.getpid(),os.getppid()))for i in 'chaoge':q.put(i)#讀資料def reader(q):print('reader啟動(%s),父進程為(%s)'%(os.getpid(),os.getppid()))for i in range(q.qsize()):print('reader 從Queue擷取到訊息:%s'%q.get())if __name__ == '__main__':print('(%s) start'%os.getpid())q = Manager().Queue()#使用Manager中的Queue來初始化po=Pool()#使用阻塞模式建立進程,這樣就不需要再reader中使用死迴圈了,可以等write執行完成後,再用readerpo.apply(writer,(q,))po.apply(reader,(q,))#寫進程po.close()po.join()print('(%s) End'%os.getpid())
(7720) start
writer啟動(7284),父進程為(7720)
reader啟動(8712),父進程為(7720)
reader 從Queue擷取到訊息:c
reader 從Queue擷取到訊息:h
reader 從Queue擷取到訊息:a
reader 從Queue擷取到訊息:o
reader 從Queue擷取到訊息:g
reader 從Queue擷取到訊息:e
(7720) End
python訊息佇列Queue