日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程

發(fā)布時間:2024/9/27 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 一.Python 線程池前言
  • 二.Python 線程池 ThreadPoolExecutor 常用函數(shù)
    • 1.線程池 as_completed 函數(shù)使用
    • 2.線程池 map 函數(shù)使用
    • 3.線程池 wait 函數(shù)使用
  • 三.猜你喜歡

零基礎(chǔ) Python 學(xué)習(xí)路線推薦 : Python 學(xué)習(xí)目錄 >> Python 基礎(chǔ)入門

一.Python 線程池前言

緊接著上一篇文章 Python 線程池 ThreadPoolExecutor(一) 我們繼續(xù)對線程池深入一點(diǎn)了解,其實(shí) Python 中關(guān)于線程池,一共有兩個模塊:

  • 1.threadpool — 是一個比較老的模塊了,現(xiàn)在雖然還有一些人在用,但已經(jīng)不再是主流了;
  • 2.concurrent.futures — 目前線程池主要使用這個模塊,主流模塊;

二.Python 線程池 ThreadPoolExecutor 常用函數(shù)

除了 Python 線程池 ThreadPoolExecutor(一) 文章中介紹的 submit / cancel / done / result 函數(shù)外,今天還需要額外講解一下另外幾個函數(shù):

1.線程池 as_completed 函數(shù)使用

雖然 done 函數(shù)提供了判斷任務(wù)是否結(jié)束的方法,但是并不是太實(shí)用,因?yàn)槲覀儾⒉恢谰€程到底什么時候結(jié)束,需要一直判斷每個任務(wù)有沒有結(jié)束。這時就可以使用 as_completed 方法一次取出所有任務(wù)的結(jié)果。

as_completed 方法是一個生成器,在沒有任務(wù)完成的時候,會阻塞,在有某個任務(wù)完成的時候,就能繼續(xù)執(zhí)行 for 循環(huán)后面的語句,然后繼續(xù)阻塞住,循環(huán)到所有的任務(wù)結(jié)束。

# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿說編程 @Blog(個人博客地址): www.codersrc.com @File:Python 線程池 ThreadPoolExecutor.py @Time:2021/05/05 07:37 @Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!"""from concurrent.futures import ThreadPoolExecutor, as_completed import time# 參數(shù)times用來模擬網(wǎng)絡(luò)請求的時間 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 indexexecutor = 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("任務(wù){(diào)} down load success".format(data))''' 輸出結(jié)果:download video 1 finished at 2021-05-05 07:10:00 任務(wù)1 down load success download video 2 finished at 2021-05-05 07:10:00 任務(wù)2 down load success download video 3 finished at 2021-05-05 07:10:02 任務(wù)3 down load success download video 4 finished at 2021-05-05 07:10:02 任務(wù)4 down load success download video 5 finished at 2021-05-05 07:10:04 任務(wù)5 down load success '''

代碼分析:

5 個任務(wù),2 個線程,由于在線程池構(gòu)造的時候允許同時最多執(zhí)行 2 個線程,所以同時執(zhí)行任務(wù) 1 和任務(wù) 2 ,重代碼的輸出結(jié)果來看,任務(wù) 1 和任務(wù) 2 執(zhí)行后,for 循環(huán)進(jìn)入阻塞狀態(tài),直到任務(wù) 1 或者任務(wù) 2 結(jié)束之后才會 for 才會繼續(xù)執(zhí)行任務(wù) 3 / 任務(wù) 4 ,并保證同時執(zhí)行的最多只有兩個任務(wù)(關(guān)于自定義時間格式請參考:Python time 模塊).

2.線程池 map 函數(shù)使用

和 as_completed 方法不同的是:map 方法能保證任務(wù)的順序性,舉個例子:如果同時下載 5 個視頻,就算第二個視頻比第一個視頻先下載完成,也會阻塞等待第一個視頻下載完成并通知主線程之后,第二個下載完成的視頻才回通知主線程,保證按照順序完成任務(wù),下面舉個例子說明一下:

# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿說編程 @Blog(個人博客地址): www.codersrc.com @File:Python 線程池 ThreadPoolExecutor.py @Time:2021/05/05 07:37 @Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!"""from concurrent.futures import ThreadPoolExecutor, as_completed import time# 參數(shù)times用來模擬網(wǎng)絡(luò)請求的時間 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 indexexecutor = ThreadPoolExecutor(max_workers=2) urls = [3, 2, 1, 4, 5]for data in executor.map(download_video,urls):print("任務(wù){(diào)} down load success".format(data))''' 輸出結(jié)果:download video 2 finished at 2021-05-05 07:10:55 download video 3 finished at 2021-05-05 07:10:56 任務(wù)3 down load success 任務(wù)2 down load success download video 1 finished at 2021-05-05 07:10:56 任務(wù)1 down load success download video 4 finished at 2021-05-05 07:10:00 任務(wù)4 down load success download video 5 finished at 2021-05-05 07:10:01 任務(wù)5 down load success '''

代碼分析:

重上面的輸出結(jié)果看來,即便任務(wù) 2 比任務(wù) 3 先完成,for 循環(huán)輸出的內(nèi)容依舊是提示先完成的任務(wù) 3 再完成任務(wù) 2 ,根據(jù)列表 urls 順序輸出,保證任務(wù)的順序性!

3.線程池 wait 函數(shù)使用

**wait 方法有點(diǎn)類似線程的 join 方法,能阻塞主線程,直到線程池中的所有的線程都操作完成!**實(shí)例代碼如下:

# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿說編程 @Blog(個人博客地址): www.codersrc.com @File:Python 線程池 ThreadPoolExecutor.py @Time:2021/05/05 07:37 @Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!"""from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED, FIRST_COMPLETED import time# 參數(shù)times用來模擬網(wǎng)絡(luò)請求的時間 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 indexexecutor = 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 ")''' 輸出結(jié)果: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 個參數(shù),等待的任務(wù)序列、超時時間以及等待條件。等待條件 return_when 默認(rèn)為 ALL_COMPLETED ,表明要等待所有的任務(wù)都結(jié)束??梢钥吹竭\(yùn)行結(jié)果中,確實(shí)是所有任務(wù)都完成了,主線程才打印出 main 。等待條件還可以設(shè)置為 FIRST_COMPLETED ,表示第一個任務(wù)完成就停止等待。**

三.猜你喜歡

  • Python 條件推導(dǎo)式
  • Python 列表推導(dǎo)式
  • Python 字典推導(dǎo)式
  • Python 函數(shù)聲明和調(diào)用
  • Python 不定長參數(shù) *argc/**kargcs
  • Python 匿名函數(shù) lambda
  • Python return 邏輯判斷表達(dá)式
  • Python 字符串/列表/元組/字典之間的相互轉(zhuǎn)換
  • Python 局部變量和全局變量
  • Python type 函數(shù)和 isinstance 函數(shù)區(qū)別
  • Python is 和 == 區(qū)別
  • Python 可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型
  • Python 淺拷貝和深拷貝
  • Python 文件讀寫操作
  • Python 異常處理
  • Python 模塊 import
  • Python __name__ == ‘__main__’詳細(xì)解釋
  • Python 線程創(chuàng)建和傳參
  • Python 線程互斥鎖 Lock
  • Python 線程時間 Event
  • Python 線程條件變量 Condition
  • Python 線程定時器 Timer
  • Python 線程信號量 Semaphore
  • Python 線程障礙對象 Barrier
  • Python 線程隊(duì)列 Queue – FIFO
  • Python 線程隊(duì)列 LifoQueue – LIFO
  • Python 線程優(yōu)先隊(duì)列 PriorityQueue
  • 未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python 線程池 ThreadPoolExecutor(二)

    總結(jié)

    以上是生活随笔為你收集整理的Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。