最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談一下python線程池簡單應用

 更新時間:2023年04月19日 10:15:49   作者:Heney33  
這篇文章主要介紹了淺談一下python線程池簡單應用,線程池在系統(tǒng)啟動時即創(chuàng)建大量空閑的線程,程序只要將一個函數(shù)提交給線程池,線程池就會啟動一個空閑的線程來執(zhí)行它,需要的朋友可以參考下

一、線程池簡介

傳統(tǒng)多線程方案會使用“即時創(chuàng)建,即時銷毀”的策略。盡管與創(chuàng)建進程相比,創(chuàng)建線程的時間已經(jīng)大大的縮短,但是如果提交給線程的任務時執(zhí)行時間較短,而且執(zhí)行次數(shù)及其頻繁,那么服務器將處于不停的創(chuàng)建線程,銷毀線程的狀態(tài)。

一個線程的運行時間可以分為三部分:線程的啟動時間、線程體的運行時間和線程的銷毀時間。

在多線程處理的情景中,如果線程不能被重用,就意味著每次線程運行都要經(jīng)過啟動、銷毀和運行3個過程。這必然會增加系統(tǒng)相應的時間,減低了效率。

線程池在系統(tǒng)啟動時即創(chuàng)建大量空閑的線程,程序只要將一個函數(shù)提交給線程池,線程池就會啟動一個空閑的線程來執(zhí)行它。

當該函數(shù)執(zhí)行結(jié)束后,該線程并不會死亡,而是再次返回到線程池中變成空閑狀態(tài),等待執(zhí)行下一個函數(shù),因此能夠避免多次創(chuàng)建線程,從而節(jié)省線程創(chuàng)建和銷毀的開銷,能帶來更好的性能和穩(wěn)定性。

此外,使用線程池可以有效地控制系統(tǒng)中并發(fā)線程的數(shù)量。當系統(tǒng)中包含有大量的并發(fā)線程時,會導致系統(tǒng)性能急劇下降,甚至導致Python解釋器崩潰,而線程池的最大線程數(shù)參數(shù)可以控制系統(tǒng)中并發(fā)線程的數(shù)量不超過此數(shù)。

服務器CPU數(shù)有限,能夠同時并發(fā)的線程數(shù)有限,并不是開得越多越好,以及線程切換時有開銷的,如果線程切換過于頻繁,反而會使性能降低。

線程池適用于:突發(fā)性大量請求或需要大量線程完成任務,但實際任務處理時間較短的場景

二、線程池在python中的應用

從python3.2開始,標準庫提供了concurrent.futures模塊,它提供了兩個子類:ThreadPoolExecutor和ProcessPoolExecutor。其中ThreadPoolExecutor用于創(chuàng)建線程池,而ProcessPoolExecutor用于創(chuàng)建進程池。不僅可以自動調(diào)度線程,還可以做到:

  • 主線程可以獲取某一個線程(或任務)的狀態(tài),以及返回值
  • 當一個線程完成的時候,主線程能夠立即知道
  • 讓多線程和多進程編碼接口一致

使用線程池/進程池來管理并發(fā)編程,只要將相應的 task 函數(shù)提交給線程池/進程池,剩下的事情就由線程池/進程池來搞定。

ThreadPoolExecutor構(gòu)造函數(shù)有兩個參數(shù):

一個是max_workers參數(shù),用于指定線程池的最大線程數(shù),如果不指定的話則默認是CPU核數(shù)的5倍。

另一個參數(shù)是thread_name_prefix,它用來指定線程池中線程的名稱前綴(可選),如下:

threadPool = ThreadPoolExecutor(max_workers=self.max_workers, thread_name_prefix="test_")

Exectuor 提供了如下常用方法:

方法描述
submit(fn, *args, **kwargs)將 fn 函數(shù)提交給線程池。*args 代表傳給 fn 函數(shù)的參數(shù),**kwargs 代表以關(guān)鍵字參數(shù)的形式為 fn 函數(shù)傳入?yún)?shù)
map(func,*iterables, timeout=None, chunksize=1)該函數(shù)類似于全局函數(shù) map(func, *iterables),只是該函數(shù)將會啟動多個線程,以異步方式立即對 iterables 執(zhí)行 map 處理
shutdown(wait=True)關(guān)閉線程池。wait=True,等待池內(nèi)所有任務執(zhí)行完畢回收完資源后才繼續(xù);wait=False,立即返回,并不會等待池內(nèi)的任務執(zhí)行完畢。但不管wait參數(shù)為何值,整個程序都會等到所有任務執(zhí)行完畢

程序?qū)?task 函數(shù)提交(submit)給線程池后,submit 方法會返回一個 Future 對象,F(xiàn)uture 類主要用于獲取線程任務函數(shù)的返回值。由于線程任務會在新線程中以異步方式執(zhí)行,因此線程執(zhí)行的函數(shù)相當于一個“將來完成”的任務,所以 Python 使用 Future 來代表。

Future 提供了如下方法:

方法描述
cancel()取消該 Future 代表的線程任務。如果該任務正在執(zhí)行,不可取消,則該方法返回 False;否則,程序會取消該任務,并返回 True
cancelled()返回 Future 代表的線程任務是否被成功取消
running()如果該 Future 代表的線程任務正在執(zhí)行、不可被取消,該方法返回 True
done()如果該 Funture 代表的線程任務被成功取消或執(zhí)行完成,則該方法返回 True
result(timeout=None)獲取該 Future 代表的線程任務最后返回的結(jié)果。如果 Future 代表的線程任務還未完成,該方法將會阻塞當前線程,其中 timeout 參數(shù)指定最多阻塞多少秒
exception(timeout=None)獲取該 Future 代表的線程任務所引發(fā)的異常。如果該任務成功完成,沒有異常,則該方法返回 None
add_done_callback(fn)為該 Future 代表的線程任務注冊一個“回調(diào)函數(shù)”,當該任務成功完成時,程序會自動觸發(fā)該 fn 函數(shù)

線程池用完后,應調(diào)用線程池的shutdown()方法,關(guān)閉線程池。也可使用with語句來管理線程池,可避免手動關(guān)閉線程池

示例一(使用submit方式):

from concurrent.futures import ThreadPoolExecutor # 導入ThreadPoolExecutor模塊
import time
 
max_workers = 5
t = []
t1 = time.time()
 
# 作為線程任務的函數(shù)
def task(x, y):
    return x + y
 
threadPool = ThreadPoolExecutor(max_workers)    # 創(chuàng)建最大線程數(shù)為max_workers的線程池
 
for i in range(20):     # 循環(huán)向線程池中提交task任務
    future = threadPool.submit(task, i, i+1)
    t.append(future)
 
# 若不需要獲取返回值,則可不需要下面兩行代碼
for i in t:
    print(i.result())   # 獲取每個任務的返回值,result()會阻塞主線程
 
threadPool.shutdown()   # 阻塞主線程,所有任務執(zhí)行完后關(guān)閉線程池
print(time.time() - t1)

示例二(使用map方式):

from concurrent.futures import ThreadPoolExecutor	# 導入ThreadPoolExecutor模塊
 
max_workers = 5
t = []
t1 = time.time()
 
# 作為線程任務的函數(shù)
def task(x):
    return x + (x + 1)
 
args = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
 
with ThreadPoolExecutor(max_workers) as threadPool:   # 創(chuàng)建最大線程數(shù)為max_workers的線程池
    results = threadPool.map(task, args)    # 啟動線程,并收集每個線任務的返回結(jié)果
 
    # 若無返回值,則可不需要下面兩行代碼
    for i in results:
        print(i)   

示例三:

as_complete():是一個生成器,在沒有任務完成的時候會阻塞,在有某個任務完成的時候會yield這個任務,執(zhí)行語句,繼續(xù)阻塞,循環(huán)到所有任務結(jié)束,先完成的任務會先通知主線程

from concurrent.futures import ThreadPoolExecutor, as_completed
import time
 
max_workers = 5
t = []
t1 = time.time()
 
# 作為線程任務的函數(shù)
def task(x, y):
    return x + y
 
def handle_result(future):
    print(future.result())
 
with ThreadPoolExecutor(max_workers) as threadPool:    # 創(chuàng)建最大線程數(shù)為max_workers的線程池
 
    for i in range(20):     # 循環(huán)向線程池中提交task任務
        future = threadPool.submit(task, i, i+1)
        t.append(future)
 
    # 若不需要獲取返回值,則可不需要下面兩行代碼
    for future in as_completed(t):  # as_completed,哪個先完成就先處理哪個,會阻塞主線程,直到完成所有,除非設置timeout
        future.add_done_callback(handle_result)

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

相關(guān)文章

  • pip?install?python-Levenshtein失敗的解決

    pip?install?python-Levenshtein失敗的解決

    這篇文章主要介紹了pip?install?python-Levenshtein失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 淺析Python 引號、注釋、字符串

    淺析Python 引號、注釋、字符串

    這篇文章主要介紹了Python 引號、注釋、字符串的相關(guān)知識,文中給大家提到了python中一對單引號,一對雙引號,三個單雙引號的區(qū)別和用法,需要的朋友可以參考下
    2019-07-07
  • python實現(xiàn)電子產(chǎn)品商店

    python實現(xiàn)電子產(chǎn)品商店

    這篇文章主要為大家詳細介紹了python實現(xiàn)電子產(chǎn)品商店,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Django中如何防范CSRF跨站點請求偽造攻擊的實現(xiàn)

    Django中如何防范CSRF跨站點請求偽造攻擊的實現(xiàn)

    這篇文章主要介紹了Django中如何防范CSRF跨站點請求偽造攻擊的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 最實用的20個python小技巧

    最實用的20個python小技巧

    大家好,本篇文章主要講的是最實用的20個python小技巧,感興趣的同學快來看一看吧,希望對你有幫助
    2021-11-11
  • pycharm配置python 設置pip安裝源為豆瓣源

    pycharm配置python 設置pip安裝源為豆瓣源

    這篇文章主要介紹了pycharm配置python 設置pip安裝源為豆瓣源,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Python selenium+cookie實現(xiàn)免密登陸的示例代碼

    Python selenium+cookie實現(xiàn)免密登陸的示例代碼

    本文主要介紹了Python selenium+cookie實現(xiàn)免密登陸的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 聊聊.py和.ipynb的一些小知識

    聊聊.py和.ipynb的一些小知識

    這篇文章主要介紹了聊聊.py和.ipynb的一些小知識,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 使用python寫一個自動瀏覽文章的腳本實例

    使用python寫一個自動瀏覽文章的腳本實例

    今天小編就為大家分享一篇使用python寫一個自動瀏覽文章的腳本實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python實現(xiàn)最常見加密方式詳解

    Python實現(xiàn)最常見加密方式詳解

    這篇文章主要介紹了Python實現(xiàn)最常見加密方式詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07

最新評論

威远县| 阿克陶县| 茂名市| 吴桥县| 左权县| 永年县| 乳山市| 公安县| 曲周县| 彝良县| 乌兰察布市| 永寿县| 英吉沙县| 河曲县| 昌黎县| 资中县| 阿坝| 德昌县| 礼泉县| 铁岭县| 门源| 涟水县| 阳朔县| 邓州市| 株洲县| 定远县| 离岛区| 东乡族自治县| 辉南县| 塔河县| 庆元县| 即墨市| 林甸县| 镇康县| 咸宁市| 深水埗区| 胶州市| 赤水市| 柞水县| 汾阳市| 廉江市|