溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python多進程與多線程的使用場景有哪些

發(fā)布時間:2021-03-06 10:23:56 來源:億速云 閱讀:245 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹Python多進程與多線程的使用場景有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

前言

Python多進程適用的場景:計算密集型(CPU密集型)任務(wù)

Python多線程適用的場景:IO密集型任務(wù)

計算密集型任務(wù)一般指需要做大量的邏輯運算,比如上億次的加減乘除,使用多核CPU可以并發(fā)提高計算性能。

IO密集型任務(wù)一般指輸入輸出型,比如文件的讀取,或者網(wǎng)絡(luò)的請求,這類場景一般會遇到IO阻塞,使用多核CPU來執(zhí)行并不會有太高的性能提升。

下面使用一臺64核的虛擬機來執(zhí)行任務(wù),通過示例代碼來區(qū)別它們,

示例1:執(zhí)行計算密集型任務(wù),進行1億次運算

使用多進程

from multiprocessing import Process
import os, time
 
 
# 計算密集型任務(wù)
def work():
 res = 0
 for i in range(100 * 100 * 100 * 100): # 億次運算
  res *= i
 
 
if __name__ == "__main__":
 l = []
 print("本機為", os.cpu_count(), "核 CPU") # 本機為64核
 start = time.time()
 for i in range(4):
  p = Process(target=work) # 多進程
  l.append(p)
  p.start()
 for p in l:
  p.join()
 stop = time.time()
 print("計算密集型任務(wù),多進程耗時 %s" % (stop - start))

使用多線程

from threading import Thread
import os, time
 
 
# 計算密集型任務(wù)
def work():
 res = 0
 for i in range(100 * 100 * 100 * 100): # 億次運算
  res *= i
 
 
if __name__ == "__main__":
 l = []
 print("本機為", os.cpu_count(), "核 CPU") # 本機為64核
 start = time.time()
 for i in range(4):
  p = Thread(target=work) # 多線程
  l.append(p)
  p.start()
 for p in l:
  p.join()
 stop = time.time()
 print("計算密集型任務(wù),多線程耗時 %s" % (stop - start))

兩段代碼輸出:

本機為 64 核 CPU
計算密集型任務(wù),多進程耗時 6.864224672317505
 
本機為 64 核 CPU
計算密集型任務(wù),多線程耗時 37.91042113304138

說明:上述代碼中,分別使用4個多進程和4個多線程去執(zhí)行億次運算,多進程耗時6.86s,多線程耗時37.91s,可見在計算密集型任務(wù)場景,使用多進程能大大提高效率。

另外,當(dāng)分別使用8個多進程和8個多線程去執(zhí)行億次運算時,耗時差距更大,輸出如下:

本機為 64 核 CPU
計算密集型任務(wù),多進程耗時 6.811635971069336
 
本機為 64 核 CPU
計算密集型任務(wù),多線程耗時 113.53767895698547

可見在64核的cpu機器下,同時使用8個多進程和4個多進程效率幾乎一樣。而使用多線程則就效率較慢。要最高效地利用CPU,計算密集型任務(wù)同時進行的數(shù)量應(yīng)當(dāng)?shù)扔贑PU的核心數(shù)

示例2:400次,阻塞兩秒,讀取文件

使用多進程(4核cpu)

from multiprocessing import Process
import os, time
 
 
# I/0密集型任務(wù)
def work():
 time.sleep(5) # 阻塞兩秒
 
 
if __name__ == "__main__":
 l = []
 print("本機為", os.cpu_count(), "核 CPU")
 start = time.time()
 for i in range(1000):
  p = Process(target=work) # 多進程
  l.append(p)
  p.start()
 for p in l:
  p.join()
 stop = time.time()
 print("I/0密集型任務(wù),多進程耗時 %s" % (stop - start))

使用多線程(4核cpu)

from threading import Thread
import os, time
 
 
# I/0密集型任務(wù)
def work():
 time.sleep(5) # 阻塞兩秒
 
 
if __name__ == "__main__":
 l = []
 print("本機為", os.cpu_count(), "核 CPU")
 start = time.time()
 
 for i in range(1000):
  p = Thread(target=work) # 多線程
  l.append(p)
  p.start()
 for p in l:
  p.join()
 stop = time.time()
 print("I/0密集型任務(wù),多線程耗時 %s" % (stop - start))

輸出:

本機為 64 核 CPU
I/0密集型任務(wù),多進程耗時 12.28218412399292
 
 
本機為 64 核 CPU
I/0密集型任務(wù),多線程耗時 5.399136066436768

說明:python的多線程有于GIL鎖的存在,無論是多少核的cpu機器,也只能使用單核,從輸出結(jié)果來看,對于IO密集型任務(wù)使用多線程比較占優(yōu)。

FAQ:執(zhí)行多進程的io密集型任務(wù)時,報了一個錯:

OSError: [Errno 24] Too many open files

原因:linux系統(tǒng)限制

ulimit -n
# 輸出 1024

解決:(臨時提高系統(tǒng)限制,重啟后失效)

ulimit -n 10240

以上是“Python多進程與多線程的使用場景有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI