亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2021年03月05日 16:08:35   作者:大帥不是我  
這篇文章主要給大家介紹了關(guān)于Python多進程與多線程使用場景的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

總結(jié)

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

相關(guān)文章

  • python文件與路徑操作神器?pathlib

    python文件與路徑操作神器?pathlib

    這篇文章主要介紹了python文件與路徑操作神器?pathlib,pathlib中封裝了PurePath和Path類,前者用于處理路徑風(fēng)格的字符串;后者是前者的子類,可直接處理路徑,下文關(guān)于更多的pathlib相關(guān)內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04
  • 取numpy數(shù)組的某幾行某幾列方法

    取numpy數(shù)組的某幾行某幾列方法

    下面小編就為大家分享一篇取numpy數(shù)組的某幾行某幾列方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 如何用Django處理gzip數(shù)據(jù)流

    如何用Django處理gzip數(shù)據(jù)流

    這篇文章主要介紹了如何用Django處理gzip數(shù)據(jù)流,幫助大家更好的理解和使用django框架,感興趣的朋友可以了解下
    2021-01-01
  • Centos安裝python3與scapy模塊的問題及解決方法

    Centos安裝python3與scapy模塊的問題及解決方法

    這篇文章主要介紹了Centos安裝python3與scapy模塊的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • pandas merge報錯的解決方案

    pandas merge報錯的解決方案

    這篇文章主要介紹了pandas merge報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • pytorch 權(quán)重weight 與 梯度grad 可視化操作

    pytorch 權(quán)重weight 與 梯度grad 可視化操作

    這篇文章主要介紹了pytorch 權(quán)重weight 與 梯度grad 可視化操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Pandas數(shù)據(jù)集的分塊讀取的實現(xiàn)

    Pandas數(shù)據(jù)集的分塊讀取的實現(xiàn)

    本文主要介紹了Pandas數(shù)據(jù)集的分塊讀取的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 通過shell+python實現(xiàn)企業(yè)微信預(yù)警

    通過shell+python實現(xiàn)企業(yè)微信預(yù)警

    這篇文章主要介紹了通過shell+python實現(xiàn)企業(yè)微信預(yù)警,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 解決pycharm修改代碼后第一次運行不生效的問題

    解決pycharm修改代碼后第一次運行不生效的問題

    這篇文章主要介紹了解決pycharm修改代碼后第一次運行不生效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 面向初學(xué)者的Python編輯器Mu

    面向初學(xué)者的Python編輯器Mu

    今天小編就為大家分享一篇關(guān)于一個面向初學(xué)者的Python編輯器Mu,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10

最新評論