天天看點

qtcpsocket類read函數接收大資料_Python 程序線程:使用PIPE交換資料

qtcpsocket類read函數接收大資料_Python 程式線程:使用PIPE交換資料

10305

程序之間交換對象

并行:同一時刻有多條指令在多個CPU上運作.

并行時常常需要程序之間交換資料,

multiprocessing

子產品提供了2個

communication channels

來交換資料:隊列

queue

和管道

pipe

qtcpsocket類read函數接收大資料_Python 程式線程:使用PIPE交換資料
除了上面兩種交換資料的方式之外,程序之間也可以使用同步原語進行資料交換,但是要盡可能的避免使用同步原語,例如鎖.因為

queue

pipe

效率上更高,更加安全.

1.使用隊列

queue

來交換資料

queue

是多程序安全的隊列,可以使用

queue

來實作多程序之間的資料傳遞.
  • put

    :此方法用來插入資料隊列中,可選參數有兩個:

    blocked\timeout

    • 如果

      blocked=True

      (預設值),并且

      timeout

      為正數,該方法會阻塞

      timeout

      指定時間.直到該隊列有剩餘的空間.如果逾時,會抛出

      Queue.Full

      異常
    • 如果

      blocked=False

      ,但是該隊列已滿,會抛出

      Queue.Full

      異常
  • get

    :此方法可以從隊列讀取并删除一個元素.可選參數有2個:

    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

不是類,是函數,該函數定義在

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 -

繼續閱讀