欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python多進程和多線程介紹

 更新時間:2022年04月27日 09:25:43   作者:小熊貓愛恰飯  
這篇文章主要介紹了python多進程和多線程,進程是分配資源的最小單位,線程是系統(tǒng)調(diào)度的最小單位,下文更多相關(guān)資料介紹,需要的小伙伴可以參考一下

一、什么是進程和線程 

進程是分配資源的最小單位,線程是系統(tǒng)調(diào)度的最小單位。

當應(yīng)用程序運行時最少會開啟一個進程,此時計算機會為這個進程開辟獨立的內(nèi)存空間,不同的進程享有不同的空間,而一個CPU在同一時刻只能夠運行一個進程,其他進程處于等待狀態(tài)。

一個進程內(nèi)部包括一個或者多個線程,這些線程共享此進程的內(nèi)存空間與資源。相當于把一個任務(wù)又細分成若干個子任務(wù),每個線程對應(yīng)一個子任務(wù)。

二、多進程和多線程 

對于一個CPU來說,在同一時刻只能運行一個進程或者一個線程,而單核CPU往往是在進程或者線程間切換執(zhí)行,每個進程或者線程得到一定的CPU時間,由于切換的速度很快,在我們看來是多個任務(wù)在并行執(zhí)行(同一時刻多個任務(wù)在執(zhí)行),但實際上是在并發(fā)執(zhí)行(一段時間內(nèi)多個任務(wù)在執(zhí)行)。

單核CPU的并發(fā)往往涉及到進程或者線程的切換,進程的切換比線程的切換消耗更多的時間與資源。在單核CPU下,CPU密集的任務(wù)采用多進程或多線程不會提升性能,而在IO密集的任務(wù)中可以提升(IO阻塞時CPU空閑)。

而多核CPU就可以做到同時執(zhí)行多個進程或者多個進程,也就是并行運算。在擁有多個CPU的情況下,往往使用多進程或者多線程的模式執(zhí)行多個任務(wù)。

三、python中的多進程和多線程

1、多進程

def Test(pid):
? ? print("當前進程{}:{}".format(pid, os.getpid()))
? ? for i in range(1000000000):
? ? ? ? pass
if __name__ == '__main__':
? ? #單進程
? ? start = time.time()
? ? for i in range(2):
? ? ? ? Test(i)
? ? end = time.time()
? ? print((end - start))

單進程輸出結(jié)果如圖:

def Test(pid):
? ? print("當前子進程{}:{}".format(pid, os.getpid()))
? ? for i in range(100000000):
? ? ? ? pass
if __name__ == '__main__':
? ? #多進程
? ? print("父進程:{}".format(os.getpid()))
? ? start = time.time()
? ? pool = Pool(processes=2)
? ? pid = [i for i in range(2)]
? ? pool.map(Test, pid)
? ? pool.close()
? ? pool.join()
? ? end = time.time()
? ? print((end - start))

多進程輸出結(jié)果如圖:

從輸出結(jié)果可以看出都是執(zhí)行兩次for循環(huán),多進程比單進程減少了近乎一半的時間(這里使用了兩個進程),并且查看CPU情況可以看出多進程利用了多個CPU。

python中的多進程可以利用mulitiprocess模塊的Pool類創(chuàng)建,利用Pool的map方法來運行子進程。

一般多進程的執(zhí)行如下代碼:

def Test(pid):
? ? print("當前子進程{}:{}".format(pid, os.getpid()))
? ? for i in range(100000000):
? ? ? ? pass
if __name__ == '__main__':
? ? #多進程
? ? print("父進程:{}".format(os.getpid()))
? ? pool = Pool(processes=2)
? ? pid = [i for i in range(4)]
? ? pool.map(Test, pid)
? ? pool.close()
? ? pool.join()

1、利用Pool類創(chuàng)建一個進程池,processes聲明在進程池中最多可以運行幾個子進程,不聲明的情況下會自動根據(jù)CPU數(shù)量來設(shè)定,原則上進程池容量不超過CPU數(shù)量。(出于資源的考慮,不要創(chuàng)建過多的進程)

2、聲明一個可迭代的變量,該變量的長度決定要執(zhí)行多少次子進程。

3、利用map()方法執(zhí)行多進程,map方法兩個參數(shù),第一個參數(shù)是多進程執(zhí)行的方法名,第二個參數(shù)是第二步聲明的可迭代變量,里面的每一個元素是方法所需的參數(shù)。 這里需要注意幾個點:1)進程池滿的時候請求會等待,以上述代碼為例,聲明了一個容量為2的進程池,但是可迭代變量有4個,那么在執(zhí)行的時候會先創(chuàng)建兩個子進程,此時進程池已滿,等待有子進程執(zhí)行完成,才繼續(xù)處理請求;

2) 子進程處理完一個請求后,會利用已經(jīng)創(chuàng)建好的子進程繼續(xù)處理新的請求而不會重新創(chuàng)建進程。

從圖3可以看出上述兩個點,如果同時處理4個進程,那么只需要2秒鐘,這里是分成兩次處理,花費了4秒,并且兩次處理使用的子進程號都相同。

3)map會將每個子進程的返回值匯總成一個列表返回。

4、在所有請求處理結(jié)束后使用close()方法關(guān)閉進程池不再接受請求。

5、使用join()方法讓主進程阻塞,等待子進程退出,join()方法要放在close()方法之后,防止主進程在子進程結(jié)束之前退出。

2、多線程

python的多線程模塊用threading類進行創(chuàng)建

import time
import threading
import os
count = 0
def change(n):
? ? global count
? ? count = count + n
? ? count = count - n
def run(n):
? ? print("當前子線程:{}".format(threading.current_thread().name))
? ? for i in range(10000000):
? ? ? ? change(n)
if __name__ == '__main__':
? ? print("主線程:{}".format(threading.current_thread().name))
? ? thread_1 = threading.Thread(target=run, args=(3,))
? ? thread_2 = threading.Thread(target=run, args=(10,))
? ? thread_1.start()
? ? thread_2.start()
? ? thread_1.join()
? ? thread_2.join()
? ? print(count)

程序執(zhí)行會創(chuàng)建一個進程,進程會默認啟動一個主線程,使用threading.Thread()創(chuàng)建子線程;target為要執(zhí)行的函數(shù);args傳入函數(shù)需要的參數(shù);start()啟動子線程,join()阻塞主線程先運行子線程。 由于變量由多個線程共享,任何一個線程都可以對于變量進行修改,如果同時多個線程修改變量就會出現(xiàn)錯誤。

上面的程序在理論上的結(jié)果應(yīng)該為0,但運行結(jié)果如圖:

出現(xiàn)這個結(jié)果的原因就是多個線程同時對于變量修改,在賦值時出現(xiàn)錯誤,具體解釋見多線程

解決這個問題就是在修改變量的時候加鎖,這樣就可以避免出現(xiàn)多個線程同時修改變量。

import time
import threading
import os
count = 0
lock = threading.Lock()
def change(n):
? ? global count
? ? count = count + n
? ? count = count - n
def run(n):
? ? print("當前子線程:{}".format(threading.current_thread().name))
? ? for i in range(10000000):
? ? ? ? # lock.acquire()
? ? ? ? # try:
? ? ? ? ? ? change(n)
? ? ? ? # finally:
? ? ? ? # ? ? lock.release()
if __name__ == '__main__':
? ? print("主線程:{}".format(threading.current_thread().name))
? ? thread_1 = threading.Thread(target=run, args=(3,))
? ? thread_2 = threading.Thread(target=run, args=(10,))
? ? thread_1.start()
? ? thread_2.start()
? ? thread_1.join()
? ? thread_2.join()
? ? print(count)

python中的線程需要先獲取GIL(Global Interpreter Lock)鎖才能繼續(xù)運行,每一個進程僅有一個GIL,線程在獲取到GIL之后執(zhí)行100字節(jié)碼或者遇到IO中斷時才會釋放GIL,這樣在CPU密集的任務(wù)中,即使有多個CPU,多線程也是不能夠利用多個CPU來提高速率,甚至可能會因為競爭GIL導(dǎo)致速率慢于單線程。所以對于CPU密集任務(wù)往往使用多進程,IO密集任務(wù)使用多線程。

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

相關(guān)文章

  • 在python代碼中加入環(huán)境變量的語句操作

    在python代碼中加入環(huán)境變量的語句操作

    這篇文章主要介紹了在python代碼中加入環(huán)境變量的語句操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 利用PyCharm Profile分析異步爬蟲效率詳解

    利用PyCharm Profile分析異步爬蟲效率詳解

    這篇文章主要給大家介紹了關(guān)于如何利用PyCharm Profile分析異步爬蟲效率的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習或者使用PyCharm具有一定的參考學(xué)習價值,需要的朋友們下面來一起學(xué)習學(xué)習吧
    2019-05-05
  • Pycharm如何返回上一次編輯處的快捷鍵

    Pycharm如何返回上一次編輯處的快捷鍵

    這篇文章主要介紹了Pycharm如何返回上一次編輯處的快捷鍵問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Python連接達夢數(shù)據(jù)庫的實現(xiàn)示例

    Python連接達夢數(shù)據(jù)庫的實現(xiàn)示例

    本文主要介紹了Python連接達夢數(shù)據(jù)庫的實現(xiàn)示例,dmPython是DM提供的依據(jù)Python DB API version 2.0中API使用規(guī)定而開發(fā)的數(shù)據(jù)庫訪問接口,使Python應(yīng)用程序能夠?qū)M數(shù)據(jù)庫進行訪問
    2023-12-12
  • 一篇文章搞懂Python程序流程控制結(jié)構(gòu)

    一篇文章搞懂Python程序流程控制結(jié)構(gòu)

    這篇文章主要給大家介紹了關(guān)于Python程序流程控制結(jié)構(gòu)的相關(guān)資料,本節(jié)學(xué)習了Python程序的控制結(jié)構(gòu)之順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • python實現(xiàn)中文文本分句的例子

    python實現(xiàn)中文文本分句的例子

    今天小編就為大家分享一篇python實現(xiàn)中文文本分句的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python內(nèi)建類型float源碼學(xué)習

    Python內(nèi)建類型float源碼學(xué)習

    這篇文章主要為大家介紹了Python內(nèi)建類型float源碼學(xué)習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python3實現(xiàn)發(fā)送QQ郵件功能(附件)

    Python3實現(xiàn)發(fā)送QQ郵件功能(附件)

    這篇文章主要為大家詳細介紹了Python3實現(xiàn)發(fā)送QQ郵件功能,附件方面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • python實現(xiàn)機器學(xué)習之多元線性回歸

    python實現(xiàn)機器學(xué)習之多元線性回歸

    這篇文章主要為大家詳細介紹了python實現(xiàn)機器學(xué)習之多元線性回歸,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 聊聊PyTorch中eval和no_grad的關(guān)系

    聊聊PyTorch中eval和no_grad的關(guān)系

    這篇文章主要介紹了聊聊PyTorch中eval和no_grad的關(guān)系,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05

最新評論