成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Python線程池的正確使用方法

Python線程池的正確使用方法

熱門標簽:企業(yè)微信地圖標注 銀川電話機器人電話 高德地圖標注收入咋樣 B52系統(tǒng)電梯外呼顯示E7 鶴壁手機自動外呼系統(tǒng)違法嗎 萊蕪電信外呼系統(tǒng) 沈陽防封電銷電話卡 怎么辦理400客服電話 地圖標注多個

Python線程池的正確使用

1、為什么要使用線程池呢?

因為線程執(zhí)行完任務之后就會被系統(tǒng)銷毀,下次再執(zhí)行任務的時候再進行創(chuàng)建。這種方式在邏輯上沒有啥問題。但是系統(tǒng)啟動一個新線程的成本是比較高,因為其中涉及與操作系統(tǒng)的交互,操作系統(tǒng)需要給新線程分配資源。打個比方吧!就像軟件公司招聘員工干活一樣。當有活干時,就招聘一個外包人員干活。當活干完之后就把這個人員辭退掉。你說在這過程中所耗費的時間成本和溝通成本是不是很大。那么公司一般的做法是:當項目立項時就確定需要幾名開發(fā)人員,然后將這些人員配齊。然后這些人員就常駐在項目組,有活就干,沒活就摸魚。線程池也是同樣的道理。線程池可以定義最大線程數(shù),這些線程有任務就執(zhí)行任務,沒任務就進入線程池中歇著。

2、線程池怎么用呢?

線程池的基類是concurrent.futures模塊中的Executor類,而Executor類提供了兩個子類,即ThreadPoolExecutor類和ProcessPoolExecutor類。其中ThreadPoolExecutor用于創(chuàng)建線程池,而ProcessPoolExecutor用于創(chuàng)建進程池。本文將重點介紹ThreadPoolExecutor類的使用。首先,讓我們來看看ThreadPoolExecutor類的構造函數(shù)。這里使用的Python版本是:3.6.7。

      def __init__(self, max_workers=None, thread_name_prefix=''):
        """Initializes a new ThreadPoolExecutor instance.

        Args:
            max_workers: The maximum number of threads that can be used to
                execute the given calls.
            thread_name_prefix: An optional name prefix to give our threads.
        """
        if max_workers is None:
            # Use this number because ThreadPoolExecutor is often
            # used to overlap I/O instead of CPU work.
            max_workers = (os.cpu_count() or 1) * 5
        if max_workers = 0:
            raise ValueError("max_workers must be greater than 0")

        self._max_workers = max_workers
        self._work_queue = queue.Queue()
        self._threads = set()
        self._shutdown = False
        self._shutdown_lock = threading.Lock()
        self._thread_name_prefix = (thread_name_prefix or
                                    ("ThreadPoolExecutor-%d" % self._counter()))

他的構造函數(shù)只有兩個參數(shù):一個是max_workers參數(shù),用于指定線程池的最大線程數(shù),如果不指定的話則默認是CPU核數(shù)的5倍。另一個參數(shù)是thread_name_prefix,它用來指定線程池中線程的名稱前綴。其他參數(shù):

  • _shutdown初始值值為False,默認情況下線程池不銷毀,即線程池的生命周期跟項目的生命周期一致。
  • self._work_queue = queue.Queue()生成緩沖隊列。
  • _threads沒有任務被提交時,線程的數(shù)量設置為0。
  • _shutdown_lock 指定線程池的鎖是Lock鎖。
  • 說完了線程池的創(chuàng)建之后,接著來看看線程池中比較常用的幾個方法吧。
  • submit(self, fn, *args, **kwargs):
  • 該方法用提交任務,即將fn函數(shù)提交給線程池,*args代表傳給fn函數(shù)的參數(shù),**kwargs代表以關鍵字參數(shù)的形式為fn函數(shù)傳入?yún)?shù)。
  • shutdown(self, wait=True):
  • 關閉線程池
  • map(func, *iterables, timeout=None, chunksize=1):
  • 該函數(shù)類似于全局函數(shù)map(func,*iterables),只是該函數(shù)將會啟動多個線程,以異步方式立即對iterables執(zhí)行map處理。

程序?qū)ask函數(shù)通過submit方法提交給線程池之后,線程池會返回一個Future對象,該對象的作用主要是用于獲取線程任務函數(shù)的返回值。Future提供了如下幾個方法。

  • cancel():取消該Future代表的線程任務。如果該任務正在執(zhí)行,不可取消,則該方法返回False;否則,程序會取消該任務,并返回True。
  • result(timeout=None):獲取該 Future 代表的線程任務最后返回的結果。如果 Future 代表的線程任務還未完成,該方法將會阻塞當前線程,其中 timeout 參數(shù)指定最多阻塞多少秒。
  • add_done_callback(fn):為該 Future 代表的線程任務注冊一個“回調(diào)函數(shù)”,當該任務成功完成時,程序會自動觸發(fā)該 fn 函數(shù)。
  • done():如果該Future代表的線程任務被成功取消或執(zhí)行完成,則該方法返回True。

來個簡單的例子:

該例中創(chuàng)建了一個最大線程數(shù)是2的線程池來執(zhí)行async_add函數(shù)。

from concurrent.futures import ThreadPoolExecutor
import threading
import time


def async_add(max):
    sum = 0
    for i in range(max):
        sum = sum + i
    time.sleep(1)
    print(threading.current_thread().name + "執(zhí)行求和操作求得的和是=" + str(sum))
    return sum

# 創(chuàng)建兩個線程
pool = ThreadPoolExecutor(max_workers=2, thread_name_prefix='測試線程')
# 向線程池提交一個task,20作為async_add()函數(shù)的參數(shù)
future1 = pool.submit(async_add, 20)
# 向線程池再提交一個task
future2 = pool.submit(async_add, 50)
# 判斷future1代表的任務是否執(zhí)行完
time.sleep(2)
print(future1.done())
print(future2.done())
# 查看future1代表的任務返回的結果
print('線程一的執(zhí)行結果是=' + str(future1.result()))
# 查看future2代表的任務的返回結果
print('線程二的執(zhí)行結果是=' + str(future2.result()))
print("----" + threading.current_thread().name + "----主線程執(zhí)行結束-----")

運行結果是:

測試線程_0執(zhí)行求和操作求得的和是=190
測試線程_1執(zhí)行求和操作求得的和是=1225
True
True
線程一的執(zhí)行結果是=190
線程二的執(zhí)行結果是=1225
----MainThread----主線程執(zhí)行結束-----

本例中定義了一個最大線程數(shù)是2的線程池,并向線程池中提交了兩個任務,其中async_add函數(shù)就是要執(zhí)行的任務。在async_add函數(shù)中添加 time.sleep(1) 休眠一秒是為了驗證done()方法返回的結果。最后才打印主線程執(zhí)行結束表明result()方法是阻塞的。如果將result()屏蔽掉。
改成如下形式:

# 創(chuàng)建兩個線程
pool = ThreadPoolExecutor(max_workers=2, thread_name_prefix='測試線程')
# 向線程池提交一個task,20作為async_add()函數(shù)的參數(shù)
future1 = pool.submit(async_add, 20)
# 向線程池再提交一個task
future2 = pool.submit(async_add, 50)
# 判斷future1代表的任務是否執(zhí)行完
print(future1.done())
print(future2.done())
print("----" + threading.current_thread().name + "----主線程執(zhí)行結束-----")

則運行結果是:

False
False
----MainThread----主線程執(zhí)行結束-----
測試線程_0執(zhí)行求和操作求得的和是=190
測試線程_1執(zhí)行求和操作求得的和是=1225

3、如何非阻塞的獲取線程執(zhí)行的結果

前面介紹的result()方法是通過阻塞的方式來獲取線程的運行結果的。那么如果通過非阻塞的方法來獲取線程任務最后的返回結果呢?這里就需要使用線程的回調(diào)函數(shù)來獲取線程的返回結果。

from concurrent.futures import ThreadPoolExecutor
import threading
import time


def async_add(max):
    sum = 0
    for i in range(max):
        sum = sum + i
    time.sleep(1)
    print(threading.current_thread().name + "執(zhí)行求和操作求得的和是=" + str(sum))
    return sum


with ThreadPoolExecutor(max_workers=2) as pool:
    # 向線程池提交一個task
    future1 = pool.submit(async_add, 20)
    future2 = pool.submit(async_add, 50)


    # 定義獲取結果的函數(shù)
    def get_result(future):
        print(threading.current_thread().name + '運行結果:' + str(future.result()))


    # 查看future1代表的任務返回的結果
    future1.add_done_callback(get_result)
    # 查看future2代表的任務的返回結果
    future2.add_done_callback(get_result)
    print('------------主線程執(zhí)行結束----')

運行結果是:

------------主線程執(zhí)行結束----
ThreadPoolExecutor-0_1執(zhí)行求和操作求得的和是=1225
ThreadPoolExecutor-0_1運行結果:1225
ThreadPoolExecutor-0_0執(zhí)行求和操作求得的和是=190
ThreadPoolExecutor-0_0運行結果:190

從結果可以看出獲取線程執(zhí)行結果的方法完全沒有阻塞到主線程的運行。這里通過add_done_callback函數(shù)向線程池中注冊了一個獲取線程執(zhí)行結果的函數(shù)get_result。
由于線程池實現(xiàn)了上下文管理協(xié)議(Context Manage Protocol),因此程序可以使用with語句來管理線程池,這樣即可避免手動關閉線程池。

4、線程池的運行策略

這里有必要介紹一下線程池的執(zhí)行策略,也就是說當線程池中的任務數(shù)大于線程池的最大線程數(shù)時,線程池該如何處理這些任務呢?處理不了的任務是直接丟棄還是慢慢處理呢?再回答這個問題之前,讓我們來看下下面這個例子:這里定義了一個最大線程數(shù)是4個線程池,然后向線程池中提交了100個task任務。

def async_add(max):
    sum = 0
    for i in range(max):
        sum = sum + i
    time.sleep(1)
    print(threading.current_thread().name + "執(zhí)行求和操作求得的和是=" + str(sum))
    return sum


with ThreadPoolExecutor(max_workers=4) as pool:
    for i in range(100):
        pool.submit(async_add, i)
    print('------------主線程執(zhí)行結束----')

運行結果是:

------------主線程執(zhí)行結束----
ThreadPoolExecutor-0_1執(zhí)行求和操作求得的和是=0
ThreadPoolExecutor-0_0執(zhí)行求和操作求得的和是=0
ThreadPoolExecutor-0_3執(zhí)行求和操作求得的和是=3
ThreadPoolExecutor-0_2執(zhí)行求和操作求得的和是=1
...省略部分結果.....
ThreadPoolExecutor-0_1執(zhí)行求和操作求得的和是=4656
ThreadPoolExecutor-0_2執(zhí)行求和操作求得的和是=4753
ThreadPoolExecutor-0_0執(zhí)行求和操作求得的和是=4560
ThreadPoolExecutor-0_3執(zhí)行求和操作求得的和是=4851

從運行結果可以看出:一直都是相同的線程來執(zhí)行這些任務,并且所有的任務都沒有被丟棄。并且任務按照先來后到的順序來執(zhí)行。這里就需要說到線程池默認的緩沖隊列了。self._work_queue = queue.Queue() 該語句會創(chuàng)建一個大小無限制的緩沖隊列。該隊列是一個 FIFO(先進先出)的常規(guī)隊列。所以當任務數(shù)超過最大線程數(shù)時,任務會暫時放在緩沖隊列queue中。當線程空閑之后會從緩沖隊列中取出任務來執(zhí)行。
該隊列有個參數(shù)maxsize可以限制隊列的大小。如果隊列的大小達到隊列的上限,就會加鎖,再次加入元素時,就會被阻塞,直到隊列中的元素被消費。如果將maxsize的設置為0或者負數(shù)時,則該隊列的大小就是無限制的。

到此這篇關于Python線程池的正確使用方法的文章就介紹到這了,更多相關Python線程池的正確使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python 線程池模塊之多線程操作代碼
  • Python爬蟲之線程池的使用
  • python線程池的四種好處總結
  • python爬蟲線程池案例詳解(梨視頻短視頻爬取)
  • python線程池 ThreadPoolExecutor 的用法示例
  • 實例代碼講解Python 線程池
  • Python 如何創(chuàng)建一個線程池
  • python線程池如何使用
  • 解決python ThreadPoolExecutor 線程池中的異常捕獲問題
  • Python定時器線程池原理詳解
  • Python 使用threading+Queue實現(xiàn)線程池示例

標簽:安慶 湘西 銀川 葫蘆島 三亞 呼倫貝爾 烏魯木齊 呼倫貝爾

巨人網(wǎng)絡通訊聲明:本文標題《Python線程池的正確使用方法》,本文關鍵詞  Python,線程,池,的,正確,使用方法,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python線程池的正確使用方法》相關的同類信息!
  • 本頁收集關于Python線程池的正確使用方法的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    免费久久久久久久久| 久久免费成人精品视频| 亚洲天堂一区在线| 在线观看亚洲精品福利片| 一二三四国产精品| 欧美日韩亚洲国内综合网| 欧美大片日本大片免费观看| 亚洲高清乱码| 日韩欧美国产综合在线一区二区三区| 中文字幕另类日韩欧美亚洲嫩草| 日本欧美在线视频免费观看| 欧美一级淫片播放口| 亚洲大型综合色站| 啪啪av大全导航福利网址| 不卡的av中国片| 欧美精品久久久久久| 亚洲日韩中文字幕在线播放| 久草免费在线观看视频| 在线看国产日韩| www.久久99| 国产激情视频在线播放| 国产人妻黑人一区二区三区| 一级黄色大片免费观看| 少妇性饥渴无码a区免费| 国产精品综合色区在线观看| 少妇高潮大叫好爽喷水| 奇米影视777在线欧美电影观看| 成人黄色三级视频| 综合网日日天干夜夜久久| 久久久久久国产精品美女| 成人毛片网站| 日韩暖暖在线视频| 97久久人人超碰caoprom欧美| 国产日韩一区二区三区在线| 91激情五月电影| 18免费在线视频| 国产一区二区三区在线视频观看| 成人在线视频免费观看| 亚洲第一毛片| 乱色精品无码一区二区国产盗| 国产精品美女久久久久久免费| 国产一级不卡毛片| 波多野结衣一区二区三区在线观看| 欧美日韩久久精品| 99成人精品| 欧美精品在线免费观看| 国产午夜久久av| 亚洲产国偷v产偷v自拍涩爱| 波多野结衣在线aⅴ中文字幕不卡| 粉嫩高潮美女一区二区三区| jizzjizzjizz在线观看| 国产精品久久久久毛片大屁完整版| 欧美经典一区二区三区| xxxxx成人.com| 国产精品精品一区二区三区午夜版| 亚洲精品午夜视频| 8888在线观看免费www| 777av视频| 97人妻人人揉人人躁人人| 欧美日韩一级二级| 国产成a人亚洲精品| 无码国产伦一区二区三区视频| 91高清视频在线免费观看| 一本一道久久a久久综合蜜桃| 国产米奇在线777精品观看| 亚洲伦理在线| 四虎成人精品免费影院| 日日躁天天躁狠狠躁| 大地资源高清在线视频观看| 91九色美女在线视频| 亚洲黄色一区二区| 中文字幕一区二区三区人妻电影| 天天干天天综合| 久久久久在线视频| 亚洲欧美一区二区三区不卡| 爽爽爽爽爽爽爽成人免费观看| 国产精品美女在线观看| 亚洲天堂第一区| 精品电影一区二区| 无码人妻一区二区三区免费| 亚洲精品无码久久久久久久| 欧美精品久久久久| 国产高清自拍视频| 波多野结衣视频在线播放| 亚洲特级片在线| 免费看av软件| 欧美成年人视频在线观看| 91free张津瑜movies| 91视视频在线观看入口直接观看www| 99蜜桃臀久久久欧美精品网站| 国产美女极品在线| 成人美女视频在线观看18| 一本大道香蕉8中文在线视频| 国产精品视频地址| 亚州av中文字幕在线免费观看| 国产一区二区三区综合| 免费观看一区二区三区毛片| 久草热久草热线频97精品| 欧洲一区二区三区精品| 91精品xxx在线观看| 欧美精品videosex牲欧美| 91网上在线视频| 欧美色老女人| 日韩激情片免费| 欧美成aaa人片免费看| 欧美特黄一区二区三区| 中文字幕日韩在线视频| 懂色av成人一区二区三区| 欧美成人精品一区二区三区在线看| 国语精品中文字幕| 国产在线视频精品一区| 精品亚洲一区二区三区四区五区| 亚洲高清自拍| 日日夜夜精品视频免费观看| 韩国av免费在线| 久久人人视频| 国产一区免费电影| 欧美激情精品久久久久久免费印度| 97成人在线观看视频| 久久综合久久久久88| 色婷婷国产精品免| 先锋影音男人站你懂得| www.久久网| 久久99精品久久久久久噜噜| 俄罗斯黄色一级片| 一区二区三区波多野结衣在线观看| 91激情在线观看| 欧美亚洲免费高清在线观看| 国产裸体永久免费无遮挡| 精品人妻一区二区三区四区不卡| 国产伦精品一区二区三区精品视频| 国产精品1区2区3区在线观看| 日本久久久久久久久久| 国产色视频在线播放| 欧美美女福利视频| 91社区在线观看播放| 日韩在线天堂| 黑人巨茎大战欧美白妇| 好看的日韩精品视频在线| 国产香蕉尹人视频在线| 亚洲国产成人av好男人在线观看| 国产日韩综合一区二区性色av| 成人在线观看免费播放| 国产高清自拍一区| 日韩欧美国产黄色| 日韩高清免费av| 精品国产三级a∨在线| 精品人伦一区二区三电影| 亚洲国产日韩精品在线| 亚洲图片欧洲图片av| 高清在线观看av| wwwwxxxx日韩| 免费三级毛片| 最新国产热播激情视频| 青青青伊人色综合久久| 一级视频在线播放| 日本精品视频一区| 91麻豆文化传媒在线观看| 粗大黑人巨茎大战欧美成人| 别急慢慢来1978如如2| 人妻精品无码一区二区| 欧美成人se01短视频在线看| 在线观看黄色片| 日韩高清一级| 久久人人爽人人爽人人片亚洲| 国产成人午夜99999| 国产精品久久久久久久天堂第1集| 91热门视频在线观看| 国产不卡一二三| 男人日女人逼逼| 午夜精品一区二区三区视频| 久热精品在线视频| 丰满少妇被猛烈进入一区二区| 中文字幕av日韩精品| 黄色激情网站| 黄色美女一级片| 成人短视频软件网站大全app| 欧美交受高潮1| 亚洲www在线| 欧美视频日韩| 艳妇乳肉豪妇荡乳av| 欧美成人午夜剧场免费观看| 精品99一区二区三区| 国产99久久精品一区二区永久免费| 日本国产精品视频| 满满都是荷尔蒙韩剧在线观看| 日韩精品在线一区二区| 欧美日韩一区二区视频在线| 在线观看中文字幕av| 一二三四在线观看视频| 五月综合激情| 国产不卡一卡2卡三卡4卡5卡在线| 91精品久久久久久久久久久久久久| 色欲一区二区三区精品a片| 91精品在线一区二区| 加勒比日本影视| 校园春色亚洲色图| 国产精品国产一区二区三区四区| 狠狠久久伊人中文字幕| 做a视频在线观看| 欧美爱爱视频网站| 特级毛片在线观看| 国产麻豆高清视频在线第一页| 日本不卡一区二区在线观看| 欧美黑人xxxx| 亚洲欧洲免费无码| 国产综合在线看| 尤物精品在线| 91精东传媒理伦片在线观看| 欧美aaa大片| 激情文学综合插| 蜜芽tv福利在线视频| 一个人免费观看在线视频www| va中文字幕| 97在线观看| а√最新版天堂中文在线| 国模大尺度视频一区二区| 国模私拍一区二区国模曼安| 国产日韩欧美亚洲一区| 欧美96在线丨欧| 欧美特级aaa| 九九九热精品免费视频观看网站| 国产成人亚洲综合色影视| 日韩电影免费观看高清完整版| 99久久综合精品| 久久精品论坛| 欧美一级电影久久| 亚洲三级视频| 日本在线观看大片免费视频| 国产激情综合| 亚洲美女在线免费观看| 深夜福利影院在线观看| 成人免费看片98| 日韩区欧美区| 欧美肉大捧一进一出免费视频| 懂色av影视一区二区三区| 久久激情五月激情| 欧美成人xxxx| 久久尤物视频| 777色狠狠一区二区三区| 欧美另类z0zxhd电影| 三上悠亚在线一区| 可以在线看的av网站| 欧美中文字幕一区二区三区| 亚洲成av人片在www色猫咪| 欧美a级片免费看| 亚洲综合丁香| 午夜一级电影| 给我免费播放片在线观看| 久久99国产精品久久| 亚洲第一黄色| 久久久久久久香蕉网| 国产精品日韩在线一区| 国产精品自拍毛片| 国产丰满美女做爰| 素人一区二区三区| 9.1成人看片| 日韩人妻精品中文字幕| 啊啊啊一区二区| 久久久久午夜电影| 亚洲a∨精品一区二区三区导航| 欧美gay1069大粗吊| 一区二区三区在线视频看| 97在线视频观看| 欧美一区二区三区红桃小说| 影音先锋男人看片资源站| 四虎成人永久地址| 日韩精品在线免费播放| 亚洲高清毛片| 伊人久久综合97精品| 2021天堂中文幕一二区在线观| 亚洲第一av色| 欧美少妇一级片| 欧美精品tushy高清| www毛片com| 日韩精品――色哟哟| 国产91国语对白在线| www.一区二区| 亚洲人成电影| 在线码字幕一区| 国产精品18久久久久久久网站| 迷人的保姆韩国| 天堂视频中文在线| 色一情一乱一伦一视频免费看| 日韩欧美精品一区二区三区| 免费黄色国产视频| 精品人妻少妇AV无码专区| 精品国语对白精品自拍视| 麻豆精品不卡国产免费看| 26uuu亚洲婷婷狠狠天堂| 在线观看18视频网站| 亚洲av毛片成人精品| 亚洲AV无码乱码国产精品牛牛| 狠狠做深爱婷婷久久综合一区| 日韩欧美有码在线| 一个人看的www在线免费观看| 老司机精品福利在线观看| 青春草在线观看视频| 蜜桃视频在线观看免费视频| 黄色一级视频在线播放| 国产91ⅴ在线精品免费观看| 色8久久久久| 成人女同在线观看| 性生活黄色大片| 日韩精品一卡二卡三卡四卡无卡| av片在线观看永久免费| 手机在线视频一区| 日韩一区二区三区高清在线观看| 成人h动漫精品一区二区| 久久久精品人妻一区二区三区四| 亚洲 欧美 激情 小说 另类| 日韩精品视频中文在线观看| 女人18毛片毛片毛片毛片区二| 69sex久久精品国产麻豆| 波多野结衣不卡视频| 黄色三级视频在线播放| 国产免费av高清在线| 一级片免费视频| 黑粗硬长欧美在线视频免费的| 黄动漫视频高清在线| 免费网站观看www在线观看| 国产成人av在线| 日韩欧美国产一区在线观看| 亚洲高清一二三区| 神马久久精品综合| 国产精品美女在线播放| 色婷婷视频在线观看| 国产激情999|