python多進程代碼實現

添加進程

引入庫文件

import multiprocessing as mp

添加新進程

def job():
    print('aaaaa')
p1 = mp.Process(target=job,args=())#args裏添加參數參數後面必須有逗號表示是可迭代的
p1.start()

阻塞進程

p1.join()#在進程結束前不執行後續代碼

進程輸出

定義多進程隊列

q = mp.Queue()

定義進程

def job(q): ##進程執行的函數
    q.put(1)   ##向進程隊列中放入數字

q = mp.Queue()##定義隊列
p1 = mp.Process(target=job,args=(q,))##創建進程1
p2 = mp.Process(target=job,args=(q,))##創建進程2
p1.start()##進程1開始
p2.start()##進程2開始
p1.join()
p2.join()
res1 = q.get()##獲取得到的結果
res2 = q.get()
print(res1+res2)

進程池

定義進程池

pool = mp.Pool()

使用進程池

def job(x):
    return x
pool = mp.Pool()## 定義進程池
pool = mp.Pool(processes=3) # 定義CPU核數量爲3,沒有這一句默認用全部的cpu

res = pool.map(job, range(10))##job是要執行的函數,後面的是一個參數列表
print(res)

使用列表表達是創建進程池

#pool.apply_async一次只能放入一個參數
multi_res = [pool.apply_async(job, (i,)) for i in range(10)]
# 從迭代器中取出
print([res.get() for res in multi_res])

進程傳入多個參數

def job1(z):#定義進程調用函數
	return job(z[0], z[1])#在函數中調用另一函數實現多參數傳遞
def job(x ,y):
	return x * y
pool = mp.Pool()
data_list=[(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10)]#定義參數列表
res = pool.map(job1,data_list)#進程池調用
print(res)#輸出結果

共享內存

##第一個參數爲共享內存的數值類型,第二個參數是具體數值
value1 = mp.Value('i', 0) ##定義整數型共享內存
value2 = mp.Value('d', 3.14)##定義浮點數型共享內存
array = mp.Array('i', [1, 2, 3, 4])##定義整數型列表共享內存

參考數據形式

Type code C Type Python Type Minimum size in bytes
'b' signed char int 1
'B' unsigned char int 1
'u' Py_UNICODE Unicode character 2
'h' signed short int 2
'H' unsigned short int 2
'i' signed int int 2
'I' unsigned int int 2
'l' signed long int 4
'L' unsigned long int 4
'q' signed long long int 8
'Q' unsigned long long int 8
'f' float float 4
'd' double float 8

進程鎖

def job(v, num, l):
    l.acquire() # 鎖住
    for _ in range(5):
        time.sleep(0.1) 
        v.value += num # 獲取共享內存
        print(v.value)
    l.release() # 釋放

def multicore():
    l = mp.Lock() # 定義一個進程鎖
    v = mp.Value('i', 0) # 定義共享內存
    p1 = mp.Process(target=job, args=(v,1,l)) # 需要將lock傳入
    p2 = mp.Process(target=job, args=(v,3,l)) 
    p1.start()
    p2.start()
    p1.join()
    p2.join()

if __name__ == '__main__':
    multicore()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章