
10305
程序之間交換對象
并行:同一時刻有多條指令在多個CPU上運作.
并行時常常需要程序之間交換資料,
子產品提供了2個
multiprocessing
來交換資料:隊列
communication channels
和管道
queue
pipe
除了上面兩種交換資料的方式之外,程序之間也可以使用同步原語進行資料交換,但是要盡可能的避免使用同步原語,例如鎖.因為![]()
qtcpsocket類read函數接收大資料_Python 程式線程:使用PIPE交換資料 和
queue
效率上更高,更加安全.
pipe
1.使用隊列 queue
來交換資料
queue
是多程序安全的隊列,可以使用
queue
來實作多程序之間的資料傳遞.
queue
常用屬性和方法:
:此方法用來插入資料隊列中,可選參數有兩個:
put
blocked\timeout
- 如果
(預設值),并且
blocked=True
為正數,該方法會阻塞
timeout
指定時間.直到該隊列有剩餘的空間.如果逾時,會抛出
timeout
異常
Queue.Full
- 如果
,但是該隊列已滿,會抛出
blocked=False
異常
Queue.Full
:此方法可以從隊列讀取并删除一個元素.可選參數有2個:
get
blocked\timeout
- 如果
(預設值),并且
blocked=True
為正數,那麼在等待時間内沒有取到任何元素,會抛出
timeout
異常
Queue.Empty
- 如果
,如果
blocked=False
有一個值可用,立即傳回該值,否則,隊列為空,會立即抛出異常
queue
Queue.Empty
qsize()
傳回隊列的大小
empty()
傳回布爾值,隊列是否為空
full()
傳回布爾值,隊列是否滿了
put(item[,block[,timeout]])
在隊列中添加元素
item
put_nowait(item)
等價與
put(item, False)
get(item[,block[,timeout]])
在隊列中删除元素并傳回該元素的值
get_nowait()
等價與
get(Flase)
close() 表示該 不加入新元素
queue
join_theread()
加入背景線程,隻能在調用 後使用.它阻塞直到背景線程退出,確定緩沖區所有資料已經重新整理到管道.預設情況下,如果程序不是隊列的建立者,則退出.它将嘗試加入隊列的背景線程.
close()
cancle_join_thread()
終止 防止背景線程在程序退出時被自動連接配接,可能會導緻資料丢失
join_thread()
隊列執行個體
執行結果:
生産者/消費者模式
以上就類似于生産者/消費者模式
它包含兩類程序:一種隻是用來生産資料,例外一種隻是用來消費資料.為了串聯他們,通常會采用共享的資料區域,就像一個倉庫.生産者産生的資料都放入倉庫中并不需要關注消費者的行為,消費者隻需要從共享倉庫中擷取資料,并不需要關心生産者的行為.
而作為倉庫關注的行為是:
運作結果
- 如果倉庫共享資料區域已滿的狀态
- 如果共享資料區域已空的狀态
在其中扮演了一個倉庫的角色,就是用來處理共享資料的
Queue
2.使用 pipe
管道
pipe
不是類,是函數,該函數定義在
Pipe
中,傳回一對通過管道連接配接的對象
multiprocessing\connection.py
和
con1
,函數的原型是
con2
Pipe()duplex=True
(預設值):管道是雙向的,處于全雙工模式,
dublex=True
都可以收發資料
con1\con2
,管道是單向的,
dublex=False
隻能用于發送,
con1
隻能用于接受
con2
傳回的是管道的兩端,兩端每個對象都有
Pipe()
和
send()
方法(還有其他方法),例如在全雙工模式下,可以用
recv()
發送消息,
con1.send()
接受消息,如果沒有消息可以接受,
con2.recv()
方法會一直阻塞,如果管道已經關閉,
recv()
會抛出
recv()
EOFError
異常
常用方法:
send(obj)
将一個對象發送到連接配接的另外一端
recv()
傳回一個由另一端 的對象,該方法會一直阻塞直到接收到對象,如果對端關閉了連接配接,或者沒有東西可以接受,将抛出
send()
EOFError
fileno
傳回由連接配接對象使用的描述符
close()
關閉連接配接對象
poll()
傳回連接配接對象是否有可以讀取的資料.
1.主程序和子程序管道通信
需要注意的是,管道在建立的時候自動連接配接了主程序,不管是使用全雙工,還是半雙工,都需要對主程序的管道進行處理.
在全雙工模式中,假設主程序是發送端,子程序是接收端
執行結果:
反之,主程序也能當接收端,子程序當發送端.
關閉管道後,
語句用于處理産生的
try
異常
EOFError
2.主程序閑置,2個子程序一發一收
在全雙工模式下,就算主程序閑置,主程序也連接配接在管道的一端,既可以在接收端,也可以在發送端.需要自己去選擇把握.
關閉管道後,
語句用于處理産生的
try
異常
EOFError
- END -