python 多程序資料互動及共享

2022-01-30 02:55:58 字數 2810 閱讀 5603

多執行緒和多程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響,而多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。

不同程序之間記憶體是不共享的,要實現兩個程序間的資料交換,可以用以下方法:

queues

使用方法和threading裡面的queue差不多

from multiprocessing import process,queue

def f(q):

q.put([2,none,'hello'])

if __name__ =='__main__':

q = queue()

p = process(target=f,args=(q,))

p.start()

print(q.get())

p.join()

執行結果

[2, none, 'hello']

多程序中,對於乙個變數,每個程序都是複製了乙份,所以每個程序之間修改資料互不影響。 queue()方法相當於第三方,把程序a的資料序列化後傳給程序b 反序列化得到資料。並不是乙個共享的變數。而是實現了資料的傳遞。

pipes 管道

類似於socket 一端傳送,一端接收,實現通訊。

from multiprocessing import process,pipe

def f(conn):

conn.send([5,'hello'])

conn.close()

if __name__ =='__main__':

parent_conn,child_conn = pipe()

p = process(target=f,args=(child_conn,))

p.start()

print(parent_conn.recv())

p.join()

執行結果

[5, 'hello']

傳送方和接收方的關係,也和socket類似,傳送方傳送幾次,接收方就要接收幾次。接收方如果接收的次數多於傳送方,那麼接收方就會卡住,直到傳送方在傳送一次。

相互通訊

def f(conn):

conn.send([5,'hello']) #傳送資料

print(conn.recv()) #接收資料

conn.close()

if __name__ =='__main__':

parent_conn,child_conn = pipe()

p = process(target=f,args=(child_conn,))

p.start()

print(parent_conn.recv()) #接收資料

parent_conn.send("hehe你好") #傳送資料

p.join()

managers

由manager()返回的manager物件控制乙個包含python物件的伺服器程序,並允許其他程序使用**來操作它們。

由manager()返回的管理器將支援型別列表、命令、命名空間、鎖、rlock、訊號量、boundedsemaphore、condition、event、barrier、queue、value和array。

from multiprocessing import process, manager

def f(d, l):

d[1] = '1'

d['2'] = 2

d[0.25] = none

print(l)

if __name__ == '__main__':

with manager() as manager:

d = manager.dict() #生成乙個字典,可以在多個程序中傳遞和共享。

l = manager.list(range(5)) #生成乙個列表,在多個程序中傳遞和共享。

p_list = #存放程序物件

for i in range(10):

p = process(target=f, args=(d, l))

p.start()

for res in p_list:

res.join() #等待程序結束

print(d)

print(l)

執行結果

[0, 1, 2, 3, 4, 1]

[0, 1, 2, 3, 4, 1, 1]

[0, 1, 2, 3, 4, 1, 1, 1]

[0, 1, 2, 3, 4, 1, 1, 1, 1]

[0, 1, 2, 3, 4, 1, 1, 1, 1, 1]

[0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1]

[0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1]

[0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1]

[0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1]

[0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

[0, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

以上實現了程序之間的資料共享,不是資料傳遞,而是真正的共享。並且可以同時修改。

manager()內部有加鎖機制,不允許兩個程序同時修改乙份資料,因為程序的資料是獨立的。

python多程序 python多程序

當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...

python多程序 Python多程序實踐

建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...

python多程序 Python多程序程式設計詳解

本文 在 python 3.6 環境下測試通過。多程序 multiprocessing 模組是在 python 2.6 版本中加入的,和多執行緒 threading 模組類似,都是用來做並行運算的。不過python既然有了threading,為什麼還要搞乙個multiprocessing呢?這是因為...