Python 執行緒池 ThreadPoolExecutor(二) - Python零基礎入門教程
目錄
零基礎 Python 學習路線推薦 : Python 學習目錄 >> Python 基礎入門
一.Python 執行緒池前言
緊接著上一篇文章 Python 執行緒池 ThreadPoolExecutor(一) 我們繼續對執行緒池深入一點了解,其實 Python 中關於執行緒池,一共有兩個模組:
- 1.threadpool — 是一個比較老的模組了,現在雖然還有一些人在用,但已經不再是主流了;
- 2.concurrent.futures — 目前執行緒池主要使用這個模組,主流模組;
二.Python 執行緒池 ThreadPoolExecutor 常用函式
除了 Python 執行緒池 ThreadPoolExecutor(一) 文章中介紹的 submit / cancel / done / result 函式外,今天還需要額外講解一下另外幾個函式:
1.執行緒池 as_completed 函式使用
雖然 done 函式提供了判斷任務是否結束的方法,但是並不是太實用,因為我們並不知道執行緒到底什麼時候結束,需要一直判斷每個任務有沒有結束。這時就可以使用 as_completed 方法一次取出所有任務的結果。
as_completed 方法是一個生成器,在沒有任務完成的時候,會阻塞,在有某個任務完成的時候,就能繼續執行 for 迴圈後面的語句,然後繼續阻塞住,迴圈到所有的任務結束。
# !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, as_completed import time # 引數times用來模擬網路請求的時間 def download_video(index): time.sleep(2) print("download video {} finished at {}".format(index,time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()))) return index executor = ThreadPoolExecutor(max_workers=2) urls = [1, 2, 3, 4, 5] all_task = [executor.submit(download_video, (url)) for url in urls] for task in as_completed(all_task): data = task.result() print("任務{} down load success".format(data)) ''' 輸出結果: download video 1 finished at 2021-05-05 07:10:00 任務1 down load success download video 2 finished at 2021-05-05 07:10:00 任務2 down load success download video 3 finished at 2021-05-05 07:10:02 任務3 down load success download video 4 finished at 2021-05-05 07:10:02 任務4 down load success download video 5 finished at 2021-05-05 07:10:04 任務5 down load success '''
程式碼分析:
5 個任務,2 個執行緒,由於線上程池構造的時候允許同時最多執行 2 個執行緒,所以同時執行任務 1 和任務 2 ,重程式碼的輸出結果來看,任務 1 和任務 2 執行後,for 迴圈進入阻塞狀態,直到任務 1 或者任務 2 結束之後才會 for 才會繼續執行任務 3 / 任務 4 ,並保證同時執行的最多隻有兩個任務(關於自定義時間格式請參考:Python time 模組).
2.執行緒池 map 函式使用
和 as_completed 方法不同的是:map 方法能保證任務的順序性,舉個例子:如果同時下載 5 個視訊,就算第二個視訊比第一個視訊先下載完成,也會阻塞等待第一個視訊下載完成並通知主執行緒之後,第二個下載完成的視訊才回通知主執行緒,保證按照順序完成任務,下面舉個例子說明一下:
# !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, as_completed
import time
# 引數times用來模擬網路請求的時間
def download_video(index):
time.sleep(index)
print("download video {} finished at {}".format(index,time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime())))
return index
executor = ThreadPoolExecutor(max_workers=2)
urls = [3, 2, 1, 4, 5]
for data in executor.map(download_video,urls):
print("任務{} down load success".format(data))
'''
輸出結果:
download video 2 finished at 2021-05-05 07:10:55
download video 3 finished at 2021-05-05 07:10:56
任務3 down load success
任務2 down load success
download video 1 finished at 2021-05-05 07:10:56
任務1 down load success
download video 4 finished at 2021-05-05 07:10:00
任務4 down load success
download video 5 finished at 2021-05-05 07:10:01
任務5 down load success
'''
程式碼分析:
重上面的輸出結果看來,即便任務 2 比任務 3 先完成,for 迴圈輸出的內容依舊是提示先完成的任務 3 再完成任務 2 ,根據列表 urls 順序輸出,保證任務的順序性!
3.執行緒池 wait 函式使用
**wait 方法有點類似執行緒的 join 方法,能阻塞主執行緒,直到執行緒池中的所有的執行緒都操作完成!**例項程式碼如下:
# !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, wait, ALL_COMPLETED, FIRST_COMPLETED
import time
# 引數times用來模擬網路請求的時間
def download_video(index):
time.sleep(2)
print("download video {} finished at {}".format(index,time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime())))
return index
executor = ThreadPoolExecutor(max_workers=2)
urls = [1, 2, 3, 4, 5]
all_task = [executor.submit(download_video,(url)) for url in urls]
wait(all_task,return_when=ALL_COMPLETED)
print("main ")
'''
輸出結果:
download video 2 finished at 2021-05-05 07:10:22
download video 1 finished at 2021-05-05 07:10:22
download video 3 finished at 2021-05-05 07:10:24
download video 4 finished at 2021-05-05 07:10:24
download video 5 finished at 2021-05-05 07:10:26
main
'''
** wait
方法接收 3 個引數,等待的任務序列、超時時間以及等待條件。等待條件 return_when
預設為 ALL_COMPLETED
,表明要等待所有的任務都結束。可以看到執行結果中,確實是所有任務都完成了,主執行緒才打印出 main
。等待條件還可以設定為 FIRST_COMPLETED
,表示第一個任務完成就停止等待。**
三.猜你喜歡
- 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(二)
本文由部落格 - 猿說程式設計 猿說程式設計 釋出!