日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

一篇文章学习Python中的多进程

發布時間:2024/7/5 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一篇文章学习Python中的多进程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基本知識:

    • 一、什么是多進程 Multiprocessing
    • 二、添加多進程 Process
    • 三、存儲進程輸出 Queue
    • 四、效率對比 threading & multiprocessing
    • 五、進程池 Pool
    • 六、共享內存 shared memory
    • 七、進程鎖 Lock

一、什么是多進程 Multiprocessing

支持并行運算,充分利用計算機的多核CPU

二、添加多進程 Process

import multiprocessing as mpdef process_job(a,b):print("a:",a)print("b:",b)if __name__=="__main__":p1 = mp.Process(target=process_job,args=(1,2)) # 定義一個進程p1p1.start() # 開啟進程p1p1.join() # 將進程p1加入到主進程

三、存儲進程輸出 Queue

多進程調用的函數不能有返回值,故使用Queue存儲結果。

import multiprocessing as mpdef process_job(q):res = 0for i in range(10):res += iq.put(res)if __name__=="__main__":q = mp.Queue()p1 = mp.Process(target=process_job,args=(q,)) # 注意args必須是可迭代的類型,但只有一個參數的時候,要加一個逗號p2 = mp.Process(target=process_job,args=(q,))p1.start()p2.start()p2.join()p1.join()print("res1:",q.get())print("res2:",q.get())

四、效率對比 threading & multiprocessing

import multiprocessing as mp import threading as td import timedef job(q):res = 0for i in range(100000):res += i + i**2 + i**3q.put(res)def multiProcess(): # 多進程運算q = mp.Queue()p1 = mp.Process(target=job,args=(q,)) p2 = mp.Process(target=job,args=(q,)) p1.start()p2.start()p2.join()p1.join()print("multiProcess_res:",q.get()+q.get())def multiThread(): # 多線程運算q = mp.Queue()t1 = td.Thread(target=job,args=(q,))t2 = td.Thread(target=job,args=(q,))t1.start()t2.start()t2.join()t1.join()print("numliThread_res:",q.get()+q.get())def normal(): # 普通運算res = 0for _ in range(2):for i in range(100000):res += i + i**2 + i**3print("normal_res:",res)if __name__=="__main__":t1 = time.time()normal()t2 = time.time()print("normal_time:",t2-t1)multiProcess()t3 = time.time()print("multiProcess_time:",t3-t2)multiThread()t4 = time.time()print("multiThread_time:",t4-t3)

結果:運行時間 多進程 < 多線程 (多線程和普通的運行時間差不多)

normal_res: 49999666671666600000 normal_time: 0.2157750129699707 multiProcess_res: 49999666671666600000 multiProcess_time: 0.14542102813720703 numliThread_res: 49999666671666600000 multiThread_time: 0.2052018642425537

五、進程池 Pool

相當于批量處理多進程
與 Process 不同的是,Pool 有返回值,返回值是一個 list,依次是每個進程執行的結果。

import multiprocessing as mpdef job(x):return x*xdef multicore():pool = mp.Pool(processes=2) res = pool.map(job, range(10)) # 方式一:使用 pool 的 map 函數print(res)res = pool.apply_async(job, (2,))print(res.get())multi_res =[pool.apply_async(job, (i,)) for i in range(10)] #方式二:使用 pool 的 apply_async 函數print([res.get() for res in multi_res])if __name__ == '__main__':multicore()

六、共享內存 shared memory

在上一篇文章的第六部分線程鎖可以看到,對于一個全局變量,多個線程之間共享全局變量,一個線程對全局變量修改以后,其他線程訪問到的是修改后的全局變量,會造成數據的混亂。
與多線程不同的是,多進程不會共享全局變量,多個進程之間不進行交流,任意一個進程對全局變量的修改都不會影響到其他進程對全局變量的訪問。
比如:

import multiprocessing as mpdef job1():global Afor i in range(3):A += 1print("Job1:",A) def job2():global Afor i in range(3):A += 10print("Job2:",A)if __name__=="__main__":A = 0p1 = mp.Process(target=job1)p2 = mp.Process(target=job2)p1.start()p2.start()p2.join()p1.join()

結果:互不影響

1 2 10 3 20 30

因此,需要設置共享內存,讓進程之間進行交流:
1、Shared Value
通過使用 Value 將數據存儲在一個共享的內存表中

import multiprocessing as mpvalue1 = mp.Value('i', 0) value2 = mp.Value('d', 3.14)

其中 d 和 i 參數用來設置數據類型的,d 表示一個雙精浮點類型,I 表示一個帶符號的整型。
2、Shared Array
mutiprocessing中,有還有一個Array類,可以和共享內存交互,來實現在進程之間共享數據

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

這里的Array和numpy中的不同,它只能是一維的,不能是多維的。同樣和Value 一樣,需要定義數據形式,否則會報錯。
參數數據類型表

七、進程鎖 Lock

1、不加進程鎖

import multiprocessing as mp import timedef job(v, num):for _ in range(5):time.sleep(0.1) # 暫停0.1秒,讓輸出效果更明顯v.value += num # v.value獲取共享變量值print(v.value, end="")def multicore():v = mp.Value('i', 0) # 定義共享變量p1 = mp.Process(target=job, args=(v,1))p2 = mp.Process(target=job, args=(v,3)) # 設定不同的number看如何搶奪內存p1.start()p2.start()p1.join()p2.join() if __name__ == '__main__':multicore()

結果:進程1和進程2在相互搶著使用共享內存v

1 4 5 8 9 12 13 16 17 20

2、加進程鎖

import multiprocessing as mp import timedef job(v, num, l):l.acquire()for _ in range(10):time.sleep(0.1)v.value += numprint(v.value)l.release()def multicore():l = mp.Lock()v = mp.Value('i', 0)p1 = mp.Process(target=job, args=(v, 1, l))p2 = mp.Process(target=job, args=(v, 3, l))p1.start()p2.start()p1.join()p2.join()if __name__ == '__main__':multicore()

結果:顯然,進程鎖保證了進程p1的完整運行,然后才進行了進程p2的運行

1 2 3 4 5 8 11 14 17 20

總結

以上是生活随笔為你收集整理的一篇文章学习Python中的多进程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。