保持多個程序之間資料的一致性至關重要,此時需要用到程序同步技術
(一)多個程序需要同時訪問共享資源時,lock可以避免訪問發生衝突
from multiprocessing import process, lock
def func(lock, num):
lock.acquire()
try:
print('hello world', num)
finally:
lock.release()
if __name__ == '__main__':
lock = lock()
for num in range(10):
process(target=func, args=(lock, num)).start()
為了保證有序輸出數字,每個程序操作前先將print語句上鎖,操作完畢後解鎖,lock物件需要通過引數傳進函式中
輸出:hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
hello world 6
hello world 7
hello world 8
hello world 9
(二)event物件被set後傳送訊號給wait的程序
from multiprocessing import process,event
import time, random
def eating(event):
event.wait()
print('去吃飯的路上...')
def ******(event):
print('做飯中')
time.sleep(random.randint(1,5))
print('做好了,快來...')
event.set()
if __name__ == '__main__':
event=event()
t1 = process(target=eating,args=(event,))
t2 = process(target=******,args=(event,))
t1.start()
t2.start()
#可以使用is_set()判斷是否被set,以及clear()清楚set。
輸出:做飯中
做好了,快來...
去吃飯的路上...
(三)共享記憶體能實現程序間的資料傳遞,適合大量資料的場合
from multiprocessing import process,value,array
def f(num,arr):
num.value=3.1415
for i in range(len(arr)):
arr[i]*=2
if __name__=='__main__':
num=value('d',0.0)
arr=array('i',range(10))
p=process(target=f,args=(num,arr))
p.start()
p.join()
print(num.value)
print(arr[:])
輸出:3.1415
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
(四)manager物件生成的資料允許其他程序訪問
from multiprocessing import process,manager
def f(d,l):
d['name']='qqq'
d['age']='12'
d['***']='male'
l.reverse()
if __name__=='__main__':
with manager() as manager:
d=manager.dict()
l=manager.list(range(10))
p=process(target=f,args=(d,l))
p.start()
p.join()
for item in d.items():
print(item)
print(l)
輸出:('name', 'qqq')
('age', '12')
('***', 'male')
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
(五)使用管道或佇列進行程序間的資料交換
管道:
from multiprocessing import process,pipe
def f(conn):
conn.send('hello world')
conn.close()
if __name__=='__main__':
parent_conn,child_conn=pipe()
p=process(target=f,args=(child_conn,))
p.start()
p.join()
print(parent_conn.recv())
parent_conn.close()
輸出:hello world
佇列
import multiprocessing
def foo(q):
q.put('hello world')
if __name__=='__main__':
multiprocessing.set_start_method('spawn')#windows系統建立子程序的方式
queue=multiprocessing.queue()
p=multiprocessing.process(target=foo,args=(queue,))
p.start()
p.join()
print(queue.get())
輸出:hello world 程序間的通訊方式,執行緒間的通訊方式 程序
當時做筆記的時候 忘了在 看到的了,有時間我再研究研究 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semo...
python程序通訊方式有幾種 程序間通訊
程序間通訊表示程序之間的資料交換。為了開發並行應用程式,需要在程序間交換資料。下圖顯示了多個子過程之間同步的各種通訊機制 各種通訊機制 在本節中,我們將了解各種通訊機制。機制如下所述 佇列佇列可以用於多程序程式。多處理模組的queue類與queue.queue類相似。因此,可以使用相同的api。mu...
程序間通訊的方式?執行緒間通訊的方式?
管道 命名管道 訊號量 訊息佇列 訊號及共享記憶體只適用於本地程序間通訊,套接字則可用於遠端通訊,因而一般用於網路程式設計。部分概念解釋 匿名管道是在快取中開闢的輸出和輸入檔案流的空間,只能用於父子關係的程序之間。因為父子程序的輸入和輸出檔案描述符是一致的。命名管道是一種實際存在的fifo檔案,稱作...