目錄
- 一.Python 執行緒池前言
- 二.Python 執行緒池原理
- 三.Python 執行緒池 ThreadPoolExecutor 函式介紹
- 四.Python 執行緒池 ThreadPoolExecutor 簡單使用
- 五.猜你喜歡
零基礎 Python 學習路線推薦 : Python 學習目錄 >> Python 基礎入門
一.Python 執行緒池前言
在前面的文章中我們已經介紹了很多關于 Python 執行緒相關的知識點,比如 執行緒互斥鎖 Lock / 執行緒事件 Event / 執行緒條件變數 Condition 等等,而今天給大家講解的是 執行緒池 ThreadPoolExecutor,可能很多小伙伴會疑惑,threading 模塊能創建執行緒,ThreadPoolExecutor 也能創建執行緒,兩者都有什么區別呢?
眾所周知,程式中使用執行緒會提高運行效率,雖然執行緒是計算機的最小單位,但是執行緒的創建和使用一樣會占用計算機資源和產生開銷,一旦創建成千上萬的執行緒,計算機一樣會死機!一個合理的程式永遠都是以消耗最少的資源干最多的事,就像公司老板,永遠都想以最少的錢,招最少的人,干最多的事!
哪個二貨在背后說我
二.Python 執行緒池原理
大家都使用過迅雷下載,當同時下載 1000 個任務甚至更多的時候,就算開通 vip 同時下載的數量也只有 8 個,如果同時創建 1000 個執行緒,首先對計算器的開銷也很大,而且每次只運行 8 個執行緒,需要不停的創建和銷毀,這樣會顯得很麻煩,
而使用執行緒池 ThreadPoolExecutor 就可以解決上面的問題,其實只需要 8 個執行緒就行了,每個執行緒各分配一個任務,剩下的任務排隊等待,當某個執行緒完成了任務的時候,排隊任務就可以安排給這個執行緒繼續執行,這就是所謂的執行緒池 ThreadPoolExecutor 原理!
三.Python 執行緒池 ThreadPoolExecutor 函式介紹
- 1.ThreadPoolExecutor 構造實體的時候,傳入 max_workers 引數來設定執行緒池中最多能同時運行的執行緒數目,
- 2.使用 submit 函式來提交執行緒需要執行的任務(函式名和引數)到執行緒池中,并回傳該任務的句柄(類似于檔案、畫圖),注意 submit 不是阻塞的,而是立即回傳,
- 3.通過 submit 函式回傳的任務句柄,能夠使用 done 方法判斷該任務是否結束,下面的例子可以看出,由于任務有 2s 的延時,在 task1 提交后立刻判斷, task1 還未完成,而在延時 4s 之后判斷,task1 就完成了,
- 4.使用 cancel 方法可以取消提交的任務,如果任務已經在執行緒池中運行了,就取消不了,這個例子中,執行緒池的大小設定為 2 ,任務已經在運行了,所以取消失敗,如果改變執行緒池的大小為 1 ,那么先提交的是 task1,task2 還在排隊等候,這是時候就可以成功取消,
- 5.使用 result 方法可以獲取任務的回傳值,注意:這個方法是阻塞的,
四.Python 執行緒池 ThreadPoolExecutor 簡單使用
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 執行緒池 ThreadPoolExecutor.py
@Time:2021/05/05 07:37
@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
"""
from concurrent.futures import ThreadPoolExecutor
import time
# 引數times用來模擬下載的時間
def down_video(times):
time.sleep(times)
print("down video {}s finished".format(times))
return times
executor = ThreadPoolExecutor(max_workers=2)
# 通過submit函式提交執行的函式到執行緒池中,submit函式立即回傳,不阻塞
task1 = executor.submit(down_video, (3))
task2 = executor.submit(down_video, (2))
# done方法用于判定某個任務是否完成
print("任務1是否已經完成:",task1.done())
# cancel方法用于取消某個任務,該任務沒有放入執行緒池中才能取消成功
print("取消任務2:",task2.cancel())
time.sleep(4)
print("任務1是否已經完成:",task1.done())
# result方法可以獲取task的執行結果
print(task1.result())
'''
輸出結果:
任務1是否已經完成: False
取消任務2: False
down video 2s finished
down video 3s finished
任務1是否已經完成: True
3
'''
執行緒池 ThreadPoolExecutor 使用遠不止如此,由于篇幅有限,關于執行緒池 as_completed / map / wait 函式和執行緒池的阻塞和執行順序相關介紹請參考Python 執行緒池 ThreadPoolExecutor(二)
五.猜你喜歡
- Python 條件推導式
- Python 串列推導式
- Python 字典推導式
- Python 函式宣告和呼叫
- Python 不定長引數 *argc/**kargcs
- Python 匿名函式 lambda
- Python return 邏輯判斷運算式
- Python 字串/串列/元組/字典之間的相互轉換
- Python 區域變數和全域變數
- Python type 函式和 isinstance 函式區別
- Python is 和 == 區別
- Python 可變資料型別和不可變資料型別
- Python 淺拷貝和深拷貝
- Python 檔案讀寫操作
- Python 例外處理
- Python 模塊 import
- Python __name__ == ‘__main__’詳細解釋
- Python 執行緒創建和傳參
- Python 執行緒互斥鎖 Lock
- Python 執行緒事件 Event
- Python 執行緒條件變數 Condition
- Python 執行緒定時器 Timer
- Python 執行緒信號量 Semaphore
- Python 執行緒障礙物件 Barrier
- Python 執行緒佇列 Queue – FIFO
- Python 執行緒佇列 LifoQueue – LIFO
- Python 執行緒優先佇列 PriorityQueue
未經允許不得轉載:猿說編程 ? Python 執行緒池 ThreadPoolExecutor(一)
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288617.html
標籤:其他
上一篇:一個高性能、小而美的序列化工具!
