1. 程式人生 > >python ---多程序 Multiprocessing

python ---多程序 Multiprocessing

 

和 threading 的比較 

多程序 Multiprocessing 和多執行緒 threading 類似, 他們都是在 python 中用來並行運算的. 不過既然有了 threading,

為什麼 Python 還要出一個 multiprocessing 呢? 原因很簡單, 就是用來彌補 threading 的一些劣勢, 比如在 threading 教程中提到的GIL.

 

建立多程序

import multiprocessing as mp
import threading as td

def job(a,b):
    
print(a,b) t1 = td.Thread(target=job,args=(1,2)) p1 = mp.Process(target=job,args=(1,2)) p1.start()

 

結果儲存在mp.queue裡

 

queue模組實現了面向多生產執行緒、多消費執行緒的佇列,

multiprocessing.queue模組實現了面向多成產程序、多消費程序的佇列

Queue.Queue是程序內非阻塞佇列。多程序各自私有

multiprocess.Queue是跨程序通訊佇列。各子程序共有。

 1 import multiprocessing as mp
2 import threading as td 3 4 def job(q): 5 res = 0 6 for i in range(1000): 7 res+=i+i**2+i**3 8 q.put(res) 9 10 11 q = mp.Queue() 12 p1 = mp.Process(target=job,args=(q,)) 13 p2 = mp.Process(target=job,args=(q,)) 14 p1.start() 15 p2.start() 16 p1.join() 17 p2.join()
18 res1 = q.get() 19 res2 = q.get() 20 print(res1+res2)

 

程序池pool

 

https://stackoverflow.com/questions/8533318/multiprocessing-pool-when-to-use-apply-apply-async-or-map

 1 import multiprocessing as mp
 2 
 3 def job(x):
 4     return x*x
 5 pool = mp.Pool()
 6 
 7 pool = mp.Pool() 
 8 res = pool.map(job, range(10))
 9 print(res)
10 
11 
12 
13 res = pool.apply_async(job, (2,))
14 # 用get獲得結果
15 print(res.get())

 

定義共享記憶體

 

其中di引數用來設定資料型別的,d表示一個雙精浮點型別,i表示一個帶符號的整型。

import multiprocessing as mp

value1 = mp.Value('i', 0) 
value2 = mp.Value('d', 3.14)

 

這裡的Array和numpy中的不同,它只能是一維的,不能是多維的。同樣和Value 一樣,需要定義資料形式,否則會報錯。

array = mp.Array('i', [1, 2, 3, 4])

 

 https://docs.python.org/3/library/array.html

加鎖

 

 1 import multiprocessing as mp
 2 
 3 def job(v,num,lock):
 4     lock.acquire() # 鎖住
 5     for _ in range(10):
 6         time.sleep(0.1)
 7         v.value +=1
 8         print(v.value)
 9     lock.release()
10     
11 
12 l = mp.Lock() # 定義一個程序鎖
13 v = mp.Value('i', 0) # 定義共享記憶體
14 p1 = mp.Process(target=job, args=(v,1,l)) # 需要將lock傳入
15 p2 = mp.Process(target=job, args=(v,3,l)) 
16 p1.start()
17 p2.start()
18 p1.join()
19 p2.join()