1. 程式人生 > >python 多程序 —— 程序間通訊

python 多程序 —— 程序間通訊

multiprocessing.Queue()

以Queue為例,在父程序中建立兩個子程序,一個往Queue裡寫資料,一個從Queue裡讀資料:

multiprcessing.Queue.put() 為 入隊操作

multiprcessing.Queue.get() 為 出隊操作

佇列 執行緒 和 程序 安全

put(obj[, block[, timeout]])

將obj放入佇列。 如果可選引數 block為True(預設值),timeout為None(預設值),則必要時阻止,直到空閒插槽可用。 如果超時是正數,它將阻止最多超時秒數,如果在該時間內沒有空閒插槽可用,則會引發Queue.Full異常。 否則(塊為False),如果空閒插槽立即可用,則將一個專案放在佇列中,否則會引發Queue.Full異常(在這種情況下,忽略超時)。

get([block[, timeout]])

從佇列中刪除並返回一個專案。 如果可選的args塊為True(預設值),超時為None(預設值),則在必要時阻止,直到專案可用。 如果超時為正數,則它將阻塞至多超時秒數,並在該時間內沒有可用專案時引發Queue.Empty異常。 否則(block為False),如果一個專案立即可用,返回一個專案,否則會引發Queue.Empty異常(在這種情況下,忽略超時)。

# -*- coding:utf-8 -*-
from multiprocessing import Process, Queue
import os
import time
import
random # 寫資料程序執行的程式碼: def write(q): print('Process to write: %s' % os.getpid()) for value in ['A', 'B', 'C']: print('Put %s to queue...' % value) q.put(value) time.sleep(random.random()) # 讀資料程序執行的程式碼: def read(q): print('Process to read: %s' % os.getpid()) while
True: value = q.get() print('Get %s from queue.' % value) if __name__ == '__main__': # 父程序建立Queue,並傳給各個子程序: q = Queue() pw = Process(target=write, args=(q,)) pr = Process(target=read, args=(q,)) # 啟動子程序pw,寫入: pw.start() # 啟動子程序pr,讀取: pr.start() # 等待pw結束: pw.join() # pr程序裡是死迴圈,無法等待其結束,只能強行終止: pr.terminate()

輸出

Process to read: 5836
Process to write: 6472
Put A to queue...
Put B to queue...
Get A from queue.
Put C to queue...
Get B from queue.
Get C from queue.

Process finished with exit code 0

multiprocessing.Pipe()

Pipe()函式返回一對由管道連線的連線物件,預設情況下是雙工(雙向)。

Pipe()返回的兩個連線物件代表管道的兩端。 每個連線物件都有send()和recv()方法(等等)。 請注意,如果兩個程序(或執行緒)嘗試同時讀取或寫入管道的同一端,管道中的資料可能會損壞。 當然,同時使用管道不同端的過程也不會有風險。

返回表示管道末端的一對Connection(conn1,conn2)物件。

如果duplex為True(預設),則管道是雙向的。

如果duplex是False,那麼管道是單向的:conn1只能用於接收訊息,conn2只能用於傳送訊息。

# -*- coding:utf-8 -*-
from multiprocessing import Process, Pipe


def f(conn):
    conn.send([42, None, 'hello'])
    while True:
        print(conn.recv())

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    parent_conn.send('666')
    p.terminate()

輸出:

[42, None, 'hello']
666

Process finished with exit code 0