Python程序間的通訊方式

2021-09-19 13:32:28 字數 3121 閱讀 1797

保持多個程序之間資料的一致性至關重要,此時需要用到程序同步技術

(一)多個程序需要同時訪問共享資源時,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檔案,稱作...