python訊息佇列Queue

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.