目錄python
補充: queue不適合傳大文件,通產傳一些消息.c#
內存畫出一片範圍做爲共享內存,用來通訊# # #pipe,底層基於共享內存
ipc機制 進程通信安全
管道pipe 基於共享的內存空間函數
隊列 pipe+鎖 queue(隊列)線程
建立共享的進程隊列,Queue是多進程安全的隊列,可使用Queue實現多進程之間的數據傳遞。code
Queue([maxsize])
建立共享的進程隊列。
參數 :maxsize是隊列中容許的最大項數。若是省略此參數,則無大小限制。隊列
底層隊列使用管道和鎖定實現。進程
from multiprocessing import Process,Queue q = Queue() q.put('ocean') q.put(2) q.put([1,2,3]) print(q.get()) print(q.get()) print(q.get()) print(q.get())#因爲在隊列管道里只存儲了3個指,當取到第四個的時候會發生阻塞,致使程序一直不會結束,等待接收值 ############# ocean 2 [1, 2, 3]
from multiprocessing import Process,Queue q= Queue(3)#定義隊列的大小 q.put('ocean') q.put('sky') q.put(2) q.put('chen')#隊列滿了的狀況下繼續放值,會堵塞,等待放值
from multiprocessing import Process,Queue q = Queue(3) q.put('ocean',block=True,timeout=2)#block=True,默認堵塞,若是滿了會堵塞等待,timeout=n,最對等待n秒,若是n秒後仍是隊列仍是滿的就報錯了 q.put('ocean',block=True,timeout=2)#block=True,默認堵塞,若是滿了會堵塞等待,timeout=n,最對等待n秒,若是n秒後仍是隊列仍是滿的就報錯了 q.put('ocean',block=True,timeout=2)#block=True,默認堵塞,若是滿了會堵塞等待,timeout=n,最對等待n秒,若是n秒後仍是隊列仍是滿的就報錯了 q.put('ocean',block=True,timeout=2)#block=True,默認堵塞,若是滿了會堵塞等待,timeout=n,最對等待n秒,若是n秒後仍是隊列仍是滿的就報錯了 ###################################### queue.Full
from multiprocessing import Process,Queue q= Queue() q.put('ocean') q.get() q.get(block=True,timeout=3)# block=True 阻塞等待,timeout最多等3s,若是3秒後仍是隊列仍是滿的就報錯了 ################### queue.Empty
from multiprocessing import Process,Queue q = Queue(3) q.put('ocean') q.put('sky') q.put('chen') q.put('oceansky',block=False)#對於block=False來講,若是出現隊列滿了就會直接報錯 ############### queue.full
from multiprocessing import Queue q = Queue() q.put('ocean') q.get() q.get(block=False)#拿不到直接報錯,無需等待 ################# queue.Empty
from multiprocessing import Queue q = Queue(1) q.put(123) q.put_nowait('666')#放不進去,直接報錯
from multiprocessing import Queue q = Queue(1) q.get() q.get_nowait()##拿不到值直接報錯
from multiprocessing import Queue import time q = Queue() q.put(123) # print(q.get()) # time.sleep(2) # print(q.empty()) # time.sleep(1) print(q.get_nowait()) print(q.empty())#Ture列表爲空
Queue([maxsize])
:建立共享的進程隊列。maxsize是隊列中容許的最大項數。若是省略此參數,則無大小限制。底層隊列使用管道和鎖定實現。另外,還須要運行支持線程以便隊列中的數據傳輸到底層管道中。
Queue的實例q具備如下方法:ip
q.get( [ block [ ,timeout ] ] )
:返回q中的一個項目。若是q爲空,此方法將阻塞,直到隊列中有項目可用爲止。block用於控制阻塞行爲,默認爲True. 若是設置爲False,將引起Queue.Empty異常(定義在Queue模塊中)。timeout是可選超時時間,用在阻塞模式中。若是在制定的時間間隔內沒有項目變爲可用,將引起Queue.Empty異常。內存
q.get_nowait()
:同q.get(False)
方法。
q.put(item [, block [,timeout ] ] )
:將item放入隊列。若是隊列已滿,此方法將阻塞至有空間可用爲止。block控制阻塞行爲,默認爲True。若是設置爲False,將引起Queue.Empty異常(定義在Queue庫模塊中)。timeout指定在阻塞模式中等待可用空間的時間長短。超時後將引起Queue.Full異常。
q.qsize()
:返回隊列中目前項目的正確數量。此函數的結果並不可靠,由於在返回結果和在稍後程序中使用結果之間,隊列中可能添加或刪除了項目。在某些系統上,此方法可能引起NotImplementedError異常。
q.empty()
:若是調用此方法時 q爲空,返回True。若是其餘進程或線程正在往隊列中添加項目,結果是不可靠的。也就是說,在返回和使用結果之間,隊列中可能已經加入新的項目。
q.full()
:若是q已滿,返回爲True. 因爲線程的存在,結果也多是不可靠的(參考q.empty()
方法)。
q.close()
:關閉隊列,防止隊列中加入更多數據。調用此方法時,後臺線程將繼續寫入那些已入隊列但還沒有寫入的數據,但將在此方法完成時立刻關閉。若是q被垃圾收集,將自動調用此方法。關閉隊列不會在隊列使用者中生成任何類型的數據結束信號或異常。例如,若是某個使用者正被阻塞在get()
操做上,關閉生產者中的隊列不會致使get()
方法返回錯誤。
q.cancel_join_thread()
:不會再進程退出時自動鏈接後臺線程。這能夠防止join_thread()
方法阻塞。
q.join_thread()
:鏈接隊列的後臺線程。此方法用於在調用q.close()
方法後,等待全部隊列項被消耗。默認狀況下,此方法由不是q的原始建立者的全部進程調用。調用q.cancel_join_thread()
方法能夠禁止這種行爲。