multiprocess.Queue(對列的用法)

隊列——multiprocess.Queue

補充: queue不適合傳大文件,通產傳一些消息.c#

內存畫出一片範圍做爲共享內存,用來通訊# # #pipe,底層基於共享內存
  1. ipc機制 進程通信安全

  2. 管道pipe 基於共享的內存空間函數

  3. 隊列 pipe+鎖 queue(隊列)線程

  4. 建立共享的進程隊列,Queue是多進程安全的隊列,可使用Queue實現多進程之間的數據傳遞。code

    Queue([maxsize])建立共享的進程隊列。
    參數 :maxsize是隊列中容許的最大項數。若是省略此參數,則無大小限制。隊列

    底層隊列使用管道和鎖定實現。進程

先進先出用法

先進先出用法1(取值堵塞)

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]

先進先出用法2(放值堵塞)

from multiprocessing import Process,Queue
q= Queue(3)#定義隊列的大小
q.put('ocean')
q.put('sky')
q.put(2)
q.put('chen')#隊列滿了的狀況下繼續放值,會堵塞,等待放值

瞭解的先進先出用法(block,timeout)

瞭解先進先出用法1

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

瞭解先進先出用法2

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

瞭解先進先出用法3

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

瞭解先進先出用法4

from multiprocessing import Queue
q = Queue()
q.put('ocean')
q.get()
q.get(block=False)#拿不到直接報錯,無需等待
#################
queue.Empty

瞭解先進先出用法5

from multiprocessing import Queue
q = Queue(1)
q.put(123)
q.put_nowait('666')#放不進去,直接報錯

瞭解先進先出用法6

from multiprocessing import Queue
q = Queue(1)
q.get()
q.get_nowait()##拿不到值直接報錯

瞭解先進先出用法7

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()方法能夠禁止這種行爲。

相關文章
相關標籤/搜索