1. 程式人生 > 其它 >Python 執行緒池 ThreadPoolExecutor(二) - Python零基礎入門教程

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 ,表示第一個任務完成就停止等待。**

三.猜你喜歡

  1. Python 條件推導式
  2. Python 列表推導式
  3. Python 字典推導式
  4. Python 函式宣告和呼叫
  5. Python 不定長引數 *argc/**kargcs
  6. Python 匿名函式 lambda
  7. Python return 邏輯判斷表示式
  8. Python 字串/列表/元組/字典之間的相互轉換
  9. Python 區域性變數和全域性變數
  10. Python type 函式和 isinstance 函式區別
  11. Python is 和 == 區別
  12. Python 可變資料型別和不可變資料型別
  13. Python 淺拷貝和深拷貝
  14. Python 檔案讀寫操作
  15. Python 異常處理
  16. Python 模組 import
  17. Python __name__ == ‘__main__’詳細解釋
  18. Python 執行緒建立和傳參
  19. Python 執行緒互斥鎖 Lock
  20. Python 執行緒時間 Event
  21. Python 執行緒條件變數 Condition
  22. Python 執行緒定時器 Timer
  23. Python 執行緒訊號量 Semaphore
  24. Python 執行緒障礙物件 Barrier
  25. Python 執行緒佇列 Queue – FIFO
  26. Python 執行緒佇列 LifoQueue – LIFO
  27. Python 執行緒優先佇列 PriorityQueue

未經允許不得轉載:猿說程式設計 » Python 執行緒池 ThreadPoolExecutor(二)

本文由部落格 - 猿說程式設計 猿說程式設計 釋出!