佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Python多進程與多線程的使用場景詳解

Python多進程與多線程的使用場景詳解

熱門標簽:百度AI接口 企業(yè)做大做強 客戶服務 呼叫中心市場需求 硅谷的囚徒呼叫中心 電話運營中心 Win7旗艦版 語音系統(tǒng)

前言

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

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

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

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

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

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

使用多進程

from multiprocessing import Process
import os, time
 
 
# 計算密集型任務
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("計算密集型任務,多進程耗時 %s" % (stop - start))

使用多線程

from threading import Thread
import os, time
 
 
# 計算密集型任務
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("計算密集型任務,多線程耗時 %s" % (stop - start))

兩段代碼輸出:

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

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

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

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

可見在64核的cpu機器下,同時使用8個多進程和4個多進程效率幾乎一樣。而使用多線程則就效率較慢。要最高效地利用CPU,計算密集型任務同時進行的數量應當等于CPU的核心數

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

使用多進程(4核cpu)

from multiprocessing import Process
import os, time
 
 
# I/0密集型任務
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密集型任務,多進程耗時 %s" % (stop - start))

使用多線程(4核cpu)

from threading import Thread
import os, time
 
 
# I/0密集型任務
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密集型任務,多線程耗時 %s" % (stop - start))

輸出:

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

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

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

OSError: [Errno 24] Too many open files

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

ulimit -n
# 輸出 1024

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

ulimit -n 10240

總結

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

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

標簽:山西 山西 海南 崇左 喀什 長沙 濟南 安康

巨人網絡通訊聲明:本文標題《Python多進程與多線程的使用場景詳解》,本文關鍵詞  ;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    闸北区| 舞钢市| 白银市| 古交市| 南溪县| 遵化市| 晋江市| 綦江县| 玉树县| 安顺市| 藁城市| 都昌县| 疏附县| 工布江达县| 云林县| 北京市| 通河县| 错那县| 弥勒县| 广河县| 新绛县| 大悟县| 越西县| 新疆| 宾川县| 广元市| 德化县| 西青区| 铜山县| 嘉黎县| 桃江县| 华池县| 平昌县| 象州县| 克什克腾旗| 蓬莱市| 新平| 会东县| 孟州市| 高唐县| 湟中县|