最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實例代碼講解Python 線程池

 更新時間:2020年08月24日 11:19:04   作者:python技術(shù)  
這篇文章主要介紹了Python 線程池的相關(guān)資料,幫助大家更好的理解和學習python,感興趣的朋友可以了解下

大家都知道當任務(wù)過多,任務(wù)量過大時如果想提高效率的一個最簡單的方法就是用多線程去處理,比如爬取上萬個網(wǎng)頁中的特定數(shù)據(jù),以及將爬取數(shù)據(jù)和清洗數(shù)據(jù)的工作交給不同的線程去處理,也就是生產(chǎn)者消費者模式,都是典型的多線程使用場景。

那是不是意味著線程數(shù)量越多,程序的執(zhí)行效率就越快呢。

顯然不是。線程也是一個對象,是需要占用資源的,線程數(shù)量過多的話肯定會消耗過多的資源,同時線程間的上下文切換也是一筆不小的開銷,所以有時候開辟過多的線程不但不會提高程序的執(zhí)行效率,反而會適得其反使程序變慢,得不償失。

所以,如何確定多線程的數(shù)量是多線程編程中一個非常重要的問題。好在經(jīng)過多年的摸索業(yè)界基本已形成一套默認的標準。

對于 CPU 密集型的計算場景,理論上將線程的數(shù)量設(shè)置為 CPU 核數(shù)就是最合適的,這樣可以將每個 CPU 核心的性能壓榨到極致,不過在工程上,線程的數(shù)量一般會設(shè)置為 CPU 核數(shù) + 1,這樣在某個線程因為未知原因阻塞時多余的那個線程完全可以頂上。

而對于 I/O 密集型的應(yīng)用,就需要考慮 CPU 計算的耗時和 I/O 的耗時比了。如果 I/O 耗時和 CPU 耗時 為 1:1,那么兩個線程是最合適的,因為當 A 線程做 I/O 操作時,B 線程執(zhí)行 CPU 計算任務(wù),當 B 線程做 I/O 操作時,A 線程執(zhí)行 CPU 計算任務(wù),CPU 和 I/O 的利用率都得到了百分百,完美。所以可以認為最佳線程數(shù) = CPU 核數(shù) * [1 +(I/O 耗時 / CPU 耗時]。

線程池

平時我們自己寫多線程程序時基本都是直接調(diào)用 Thread(target=method) 即可,實際上創(chuàng)建線程遠沒有這么簡單,需要分配內(nèi)存,同時線程還需要調(diào)用操作系統(tǒng)內(nèi)核的 API,然后操作系統(tǒng)還需要為線程分配一系列的資源,過程很是復雜,所以要盡量避免頻繁的創(chuàng)建和銷毀線程。

回想一下自己平時寫多線程代碼的模式,是不是當任務(wù)來臨時直接創(chuàng)建線程,執(zhí)行任務(wù),當任務(wù)執(zhí)行結(jié)束之后,線程也就隨之消亡了。然后又開始循環(huán)往復。有多少個任務(wù)就創(chuàng)建了多少個線程。這種模式的話很浪費硬件資源。

那如何避免這種問題呢,線程池就派上用場了。

其實線程池就是生產(chǎn)者消費者模式的最佳實踐,當線程池初始化時,會自動創(chuàng)建指定數(shù)量的線程,有任務(wù)到達時直接從線程池中取一個空閑線程來用即可,當任務(wù)執(zhí)行結(jié)束時線程不會消亡而是直接進入空閑狀態(tài),繼續(xù)等待下一個任務(wù)。而隨著任務(wù)的增加線程池中的可用線程必將逐漸減少,當減少至零時,任務(wù)就需要等待了。

在 python 中使用線程池有兩種方式,一種是基于第三方庫 threadpool,另一種是基于 python3 新引入的庫 concurrent.futures.ThreadPoolExecutor。這里我們都做一下介紹。

threadpool 方式

使用 threadpool 前需要先安裝一下,看了這么久我們的文章,相信你很快就會搞定的。在命令行執(zhí)行如下命令即可。

pip install threadpool

以下是一個簡易的線程池使用模版,我們創(chuàng)建了一個函數(shù) sayhello,然后創(chuàng)建了一個大小為 2 的線程池,也就是線程池總共有兩個活躍線程。

最后通過 pool.putRequest() 將任務(wù)丟到線程池執(zhí), pool.wait() 等待所有線程結(jié)束。同時我們還可以定義回調(diào)函數(shù),拿到任務(wù)的返回結(jié)果。

由結(jié)果我們可以看出,線程池中的確只有兩個線程,分別為 Thread-1Thread-2。

import time
import threadpool
import threading

def sayhello(name):
  print("%s say Hello to %s" % (threading.current_thread().getName(), name));
  time.sleep(1)
  return name

def callback(request, result): # 回調(diào)函數(shù),用于取回結(jié)果
  print("callback result = %s" % result)

name_list =['admin','root','scott','tiger']
start_time = time.time()
pool = threadpool.ThreadPool(2) # 創(chuàng)建線程池
requests = threadpool.makeRequests(sayhello, name_list, callback) # 創(chuàng)建任務(wù)
[pool.putRequest(req) for req in requests] # 加入任務(wù)
pool.wait() 
print('%s cost %d second' % (threading.current_thread().getName(), time.time()-start_time))

## 運行結(jié)果如下
Thread-1 say Hello to admin
Thread-2 say Hello to root
Thread-1 say Hello to scott
Thread-2 say Hello to tiger
callback result = admin
callback result = root
callback result = tiger
callback result = scott
MainThread cost 2 second

ThreadPoolExecutor 方式

ThreadPoolExecutor 是 python3 新引入的庫,具體使用方法與 threadpool 大同小異,同樣是創(chuàng)建容量為 2 的線程池,提交四個任務(wù)。只不過這里分別是通過 submit as_completed 來提交和獲取任務(wù)返回結(jié)果的。

同樣由輸出結(jié)果我們可以看出,兩種線程池的實現(xiàn)方式中關(guān)于線程的命名方式是不一致的。

import time
import threading
from concurrent.futures import ThreadPoolExecutor, as_completed

def sayhello(name):
  print("%s say Hello to %s" % (threading.current_thread().getName(), name));
  time.sleep(1)
  return name

name_list =['admin','root','scott','tiger']
start_time = time.time()
with ThreadPoolExecutor(2) as executor: # 創(chuàng)建 ThreadPoolExecutor 
  future_list = [executor.submit(sayhello, name) for name in name_list] # 提交任務(wù)

for future in as_completed(future_list):
  result = future.result() # 獲取任務(wù)結(jié)果
  print("%s get result : %s" % (threading.current_thread().getName(), result))

print('%s cost %d second' % (threading.current_thread().getName(), time.time()-start_time))

## 運行結(jié)果如下
ThreadPoolExecutor-0_0 say Hello to admin
ThreadPoolExecutor-0_1 say Hello to root
ThreadPoolExecutor-0_0 say Hello to scott
ThreadPoolExecutor-0_1 say Hello to tiger
MainThread get result : root
MainThread get result : tiger
MainThread get result : scott
MainThread get result : admin
MainThread cost 2 second

線程池總結(jié)

本文介紹了常用的兩種線程池的實現(xiàn)方式,在多線程編程中能使用線程池就不要自己去創(chuàng)建線程,并不是說線程池實現(xiàn)的多么好,其實我們自己完全也可以實現(xiàn)一個功能更強大的線程池。但是其內(nèi)置的線程池一來是受過全方面測試的,在安全性,性能和方便性上基本就是最優(yōu)的了,同時線程池還替我們做了很多額外的工作,比如任務(wù)隊列的維護,線程銷毀時資源的回收等都不需要開發(fā)者去關(guān)心,我們只需注重業(yè)務(wù)邏輯即可,不需要在關(guān)心其他額外的工作,這將大大提高我們的的工作效率和使用感受。

當然其自帶的線程池也不是十全十美的,至少暫時沒有提供動態(tài)添加任務(wù)的入口出來。而且在設(shè)計方面不夠靈活,比如我想線程池只維護一個核心數(shù)量,也就是上文說的最大數(shù)量。但是當任務(wù)過多時可以再額外創(chuàng)建出一些新的線程(閾值可以自定義),處理完之后這些多余的線程將自動銷毀,目前這個是做不到的。

代碼地址

https://github.com/JustDoPython/python-100-day/tree/master/day-053

參考資料

https://chrisarndt.de/projects/threadpool/api/

以上就是實例代碼講解Python 線程池的詳細內(nèi)容,更多關(guān)于Python 線程池的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python將Excel轉(zhuǎn)換為多種圖片格式的方法(PNG, JPG, BMP, SVG)

    Python將Excel轉(zhuǎn)換為多種圖片格式的方法(PNG, JPG, BMP, SVG)

    有時,你可能希望以圖片形式分享Excel數(shù)據(jù),以防止他人對數(shù)據(jù)進行修改或編輯,將Excel轉(zhuǎn)換為圖片可以將數(shù)據(jù)鎖定為靜態(tài)圖片,確保數(shù)據(jù)的完整性和準確性,這篇文章將探討如何使用Python實現(xiàn)將Excel工作表轉(zhuǎn)換為多種圖片格式,如PNG,JPG,BMP和SVG,需要的朋友可以參考下
    2025-03-03
  • Python如何將jpg圖像修改大小并轉(zhuǎn)換為png

    Python如何將jpg圖像修改大小并轉(zhuǎn)換為png

    這篇文章主要介紹了Python如何將jpg圖像修改大小并轉(zhuǎn)換為png問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python語言快速上手學習方法

    Python語言快速上手學習方法

    今天小編就為大家分享一篇關(guān)于Python語言快速上手學習方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Python編程pygame模塊實現(xiàn)移動的小車示例代碼

    Python編程pygame模塊實現(xiàn)移動的小車示例代碼

    這篇文章主要介紹了Python編程pygame模塊實現(xiàn)移動的小車示例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • keras 實現(xiàn)輕量級網(wǎng)絡(luò)ShuffleNet教程

    keras 實現(xiàn)輕量級網(wǎng)絡(luò)ShuffleNet教程

    這篇文章主要介紹了keras 實現(xiàn)輕量級網(wǎng)絡(luò)ShuffleNet教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python區(qū)塊鏈地址的簡版實現(xiàn)

    python區(qū)塊鏈地址的簡版實現(xiàn)

    這篇文章主要為大家介紹了python區(qū)塊鏈地址的簡版實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python之批量創(chuàng)建文件的實例講解

    Python之批量創(chuàng)建文件的實例講解

    今天小編就為大家分享一篇Python之批量創(chuàng)建文件的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python預測2020高考分數(shù)和錄取情況

    Python預測2020高考分數(shù)和錄取情況

    這篇文章主要介紹了Python預測2020高考分數(shù)和錄取情況可能是這樣,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Python中Arrow庫的時間操作技法總結(jié)

    Python中Arrow庫的時間操作技法總結(jié)

    Arrow是一個功能強大、易用且具有優(yōu)雅設(shè)計的Python日期時間庫,它建立在Python的datetime模塊之上,旨在彌補datetime模塊在處理日期時間時的一些不足之處,下面我們就來了解一下Arrow庫的常見時間操作吧
    2023-12-12
  • 使用python爬取抖音app視頻的實例代碼

    使用python爬取抖音app視頻的實例代碼

    這篇文章主要介紹了使用python爬取抖音app視頻的實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

辽源市| 盐山县| 巩义市| 丽水市| 独山县| 沧州市| 句容市| 章丘市| 桦南县| 蕲春县| 昌吉市| 栾城县| 靖江市| 沧州市| 句容市| 娄烦县| 玛曲县| 肇源县| 馆陶县| 岗巴县| 文山县| 荆门市| 石首市| 临江市| 龙里县| 兰溪市| 睢宁县| 屯留县| 安平县| 巨鹿县| 紫阳县| 三原县| 湘西| 康平县| 阿拉善右旗| 浠水县| 吉木乃县| 阿拉善右旗| 兴安盟| 荣成市| 汽车|