目錄
- 一.Python 執行緒池前言
- 二.Python 執行緒池 ThreadPoolExecutor 常用函式
- 1.執行緒池 as_completed 函式使用
- 2.執行緒池 map 函式使用
- 3.執行緒池 wait 函式使用
- 三.猜你喜歡
零基礎 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 = https://www.cnblogs.com/shuopython/archive/2021/06/28/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(二)
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288625.html
標籤:其他
