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