多執行緒和多程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響,而多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。
不同程序之間記憶體是不共享的,要實現兩個程序間的資料交換,可以用以下方法:
queues
使用方法和threading裡面的queue差不多
from multiprocessing import process,queuedef 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,pipedef 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, managerdef 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呢?這是因為...