91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python自帶的線程池和進程池有什么用

發布時間:2021-07-16 09:48:52 來源:億速云 閱讀:208 作者:chen 欄目:web開發

這篇文章主要介紹“Python自帶的線程池和進程池有什么用”,在日常操作中,相信很多人在Python自帶的線程池和進程池有什么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python自帶的線程池和進程池有什么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

from concurrent.futures import ...

可能也是因為線程池這個東西用的越來越多了吧,從Python3.2+之后,就成了內置模塊。

對的,直接就能使用,不需要pip進行安裝什么的。

concurrent.futures下面主要有倆接口。

  • ThreadPoolExecutor 線程池。

  • ProcessPoolExecutor進程池。

這里可沒有什么所謂的異步池。

個人看法:雖然異步的性能很高,但是目前除了Go以外,其他實現的都不是太好,用法上面有些怪異,當然,你們可以說我菜,我承認。

線程池

示例代碼

import time from concurrent.futures import ThreadPoolExecutor import random  # max_workers表示工人數量,也就是線程池里面的線程數量 pool = ThreadPoolExecutor(max_workers=10) # 任務列表 task_list = ["任務1", "任務2", "任務3", "任務4", ]   def handler(task_name):     # 隨機睡眠,模仿任務執行時間不確定性     n = random.randrange(5)     time.sleep(n)     print(f"任務內容:{task_name}")   if __name__ == '__main__':     # 遍歷任務,     for task in task_list:         """             交給函數處理,submit會將所有任務都提交到一個地方,不會阻塞             然后線程池里面的每個線程會來取任務,             比如:線程池有3個線程,但是有5個任務             會先取走三個任務,每個線程去處理             其中一個線程處理完自己的任務之后,會再來提交過的任務區再拿走一個任務         """         pool.submit(handler, task)     print("main執行完畢")

執行結果

Python自帶的線程池和進程池有什么用

發現的問題

其實這個就是并發的,不要懷疑,但是你有沒有發現個問題,main先執行,這說明啥?

這說明,我main跑完之后,是不管子線程的死活的。

那能不能設置一下,所有的子線程都執行完之后,main函數在執行完?

當然可以,需要一個參數即可。

pool.shutdown()

要完成上述的問題,我們需要一個參數,加上這個參數之后。

就可以讓主線程等待所有子線程執行完之后,主線程再執行完。

示例代碼

... if __name__ == '__main__':     # 遍歷任務,     for task in task_list:         """             交給函數處理,submit會將所有任務都提交到一個地方             然后線程池里面的每個線程會來取任務,             比如:線程池有3個線程,但是有5個任務             會先取走三個任務,每個線程去處理             其中一個線程處理完自己的任務之后,會再來提交過的任務區再拿走一個任務         """         pool.submit(handler, task)     pool.shutdown()     print("main執行完畢")

主要就是13行的pool.shutdown()。

執行結果

Python自帶的線程池和進程池有什么用

這次結果就是我們想要的了,hhh!!!

add_done_callback

add_done_callback可以理解為是回調函數,線程執行完之后,會自動調用指定的回調函數。

并且能拿到線程執行函數的返回值。

有什么用,我也沒用過,怪我才疏學淺叭。

示例代碼

import time from concurrent.futures import ThreadPoolExecutor import random from concurrent.futures._base import Future  # max_workers表示工人數量,也就是線程池里面的線程數量 pool = ThreadPoolExecutor(max_workers=10) # 任務列表 task_list = ["任務1", "任務2", "任務3", "任務4", ]   def handler(task_name):     # 隨機睡眠,模仿任務執行時間不確定性     n = random.randrange(5)     time.sleep(n)     print(f"任務內容:{task_name}")     return f"任務內容:{task_name}"   def done(res: Future):     print("done拿到的返回值:", res.result())   if __name__ == '__main__':     # 遍歷任務,     for task in task_list:         futrue = pool.submit(handler, task)  # type:Future         futrue.add_done_callback(done)     pool.shutdown()     print("main執行完畢")

注意:第17,27,28行代碼!

執行效果

Python自帶的線程池和進程池有什么用

我想,可能通常用在一些善后工作叭。

多進程方式

其實通過上述幾個例子,我們基本是知道怎么使用上面這個線程池了。

但是都知道Python的線程,因為GIL(全局解釋器鎖)的原因,是不能并發到多個物理核心上的。

所以是IO密集型的,像爬蟲,讀寫文件,使用線程池是ok的。

但是如果說我就是野,就是頭鐵,非要用Python做計算型應用,像圖片壓縮、視頻流推送,那沒辦法,需要使用多進程池方式。

其實通過concurrent這個接口,可以很方便的創建進程池,只需要修改兩個地方。

... # 改成導入進程池方式 from concurrent.futures import ProcessPoolExecutor ... if __name__ == '__main__':     ...     # 進程池方式     pool = ProcessPoolExecutor(max_workers=10)     ...

只需要修改這倆地方即可,其他和上述用法一摸一樣。

總結

本篇主要講的是Python自帶的線程池和進程池。

比較有特色的是,ThreadPoolExecutor,ProcessPoolExecutor的接口是一樣的。

只需要修改導入的包就行。

concurrent的接口主要有pool.submit(),pool.shutdown(),futrue.add_done_callback()。

基本這幾個都夠自己用了。

到此,關于“Python自帶的線程池和進程池有什么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽宁省| 呼和浩特市| 神池县| 鸡泽县| 屯门区| 武安市| 灌南县| 门头沟区| 石阡县| 祁东县| 河间市| 茂名市| 观塘区| 新沂市| 正阳县| 元氏县| 买车| 稷山县| 临湘市| 邵阳县| 和田县| 宝坻区| 花莲县| 凤翔县| 武川县| 交口县| 思茅市| 仙桃市| 池州市| 平定县| 治多县| 南平市| 青海省| 宣城市| 东海县| 元氏县| 乌什县| 化德县| 梓潼县| 盐亭县| 南宁市|