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

python ---多進程 Multiprocessing

形式 加鎖 線程 += col 表示 urn 跨進程 div

和 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()

python ---多進程 Multiprocessing