主頁 > 知識(shí)庫 > Python多進(jìn)程與多線程的使用場景詳解

Python多進(jìn)程與多線程的使用場景詳解

熱門標(biāo)簽:鄭州智能外呼系統(tǒng)中心 北京外呼電銷機(jī)器人招商 crm電銷機(jī)器人 電銷機(jī)器人 金倫通信 400電話 申請(qǐng) 條件 云南地圖標(biāo)注 汕頭電商外呼系統(tǒng)供應(yīng)商 賓館能在百度地圖標(biāo)注嗎 南京crm外呼系統(tǒng)排名

前言

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

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

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

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

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

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

使用多進(jìn)程

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

使用多線程

from threading import Thread
import os, time
 
 
# 計(jì)算密集型任務(wù)
def work():
 res = 0
 for i in range(100 * 100 * 100 * 100): # 億次運(yùn)算
  res *= i
 
 
if __name__ == "__main__":
 l = []
 print("本機(jī)為", os.cpu_count(), "核 CPU") # 本機(jī)為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("計(jì)算密集型任務(wù),多線程耗時(shí) %s" % (stop - start))

兩段代碼輸出:

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

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

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

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

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

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

使用多進(jìn)程(4核cpu)

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

輸出:

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

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

FAQ:執(zhí)行多進(jìn)程的io密集型任務(wù)時(shí),報(bào)了一個(gè)錯(cuò):

OSError: [Errno 24] Too many open files

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

ulimit -n
# 輸出 1024

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

ulimit -n 10240

總結(jié)

到此這篇關(guān)于Python多進(jìn)程與多線程使用場景的文章就介紹到這了,更多相關(guān)Python多進(jìn)程與使用場景內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 分析詳解python多線程與多進(jìn)程區(qū)別
  • 手把手帶你了解python多進(jìn)程,多線程
  • Python多進(jìn)程共享numpy 數(shù)組的方法
  • 總結(jié)python多進(jìn)程multiprocessing的相關(guān)知識(shí)
  • Python多線程與多進(jìn)程相關(guān)知識(shí)總結(jié)
  • python實(shí)現(xiàn)多進(jìn)程并發(fā)控制Semaphore與互斥鎖LOCK
  • python 多進(jìn)程和多線程使用詳解
  • python 實(shí)現(xiàn)多進(jìn)程日志輪轉(zhuǎn)ConcurrentLogHandler
  • python多進(jìn)程執(zhí)行方法apply_async使用說明
  • Python 多進(jìn)程原理及實(shí)現(xiàn)
  • python多線程和多進(jìn)程關(guān)系詳解
  • Python多進(jìn)程的使用詳情

標(biāo)簽:石家莊 昆明 西寧 錫林郭勒盟 文山 梅州 懷化 浙江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python多進(jìn)程與多線程的使用場景詳解》,本文關(guān)鍵詞  Python,多,進(jìn)程,與,線程,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python多進(jìn)程與多線程的使用場景詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python多進(jìn)程與多線程的使用場景詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章