您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)python線程池有什么優(yōu)點(diǎn)的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向?qū)ο蟮哪_本語言,其最初的設(shè)計(jì)是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發(fā)獨(dú)立的項(xiàng)目和大型項(xiàng)目。
提高性能:由于減去了大量新建終止線程的費(fèi)用,重用了線程資源;
適用場景:適用于處理大量突發(fā)請求或需要大量線程完成任務(wù),但實(shí)際任務(wù)處理時間短。
防御功能:可以有效避免系統(tǒng)因線程過多而導(dǎo)致系統(tǒng)負(fù)載過大而相應(yīng)變慢的問題。
代碼優(yōu)勢:使用線程池的語法比創(chuàng)建自己的線程更簡單。
""" @file : 004-線程池的使用.py @author : xiaolu @email : luxiaonlp@163.com @time : 2021-02-01 """ import concurrent.futures import requests from bs4 import BeautifulSoup def craw(url): # 爬取網(wǎng)頁內(nèi)容 r = requests.get(url) return r.text def parse(html): # 解析其中的內(nèi)容 soup = BeautifulSoup(html, "html.parser") links = soup.find_all("a", class_="post-item-title") return [(link["href"], link.get_text()) for link in links] # 那鏈接和標(biāo)題拿出來 if __name__ == '__main__': # 待爬取的網(wǎng)頁鏈接 urls = [ "https://www.cnblogs.com/sitehome/p/{}".format(page) for page in range(1, 50 + 1) ] # craw with concurrent.futures.ThreadPoolExecutor() as pool: htmls = pool.map(craw, urls) htmls = list(zip(urls, htmls)) for url, html in htmls: print(url, len(html)) print("craw over") # parse with concurrent.futures.ThreadPoolExecutor() as pool: futures = {} for url, html in htmls: future = pool.submit(parse, html) futures[future] = url # for future, url in futures.items(): # print(url, future.result()) for future in concurrent.futures.as_completed(futures): url = futures[future] print(url, future.result())
知識點(diǎn)補(bǔ)充:
線程池的使用
線程池的基類是 concurrent.futures 模塊中的 Executor,Executor 提供了兩個子類,即 ThreadPoolExecutor 和ProcessPoolExecutor,其中 ThreadPoolExecutor 用于創(chuàng)建線程池,而 ProcessPoolExecutor 用于創(chuàng)建進(jìn)程池。
如果使用線程池/進(jìn)程池來管理并發(fā)編程,那么只要將相應(yīng)的 task 函數(shù)提交給線程池/進(jìn)程池,剩下的事情就由線程池/進(jìn)程池來搞定。
Exectuor 提供了如下常用方法:
submit(fn, *args, **kwargs):將 fn 函數(shù)提交給線程池。*args 代表傳給 fn 函數(shù)的參數(shù),*kwargs 代表以關(guān)鍵字參數(shù)的形式為 fn 函數(shù)傳入?yún)?shù)。
map(func, *iterables, timeout=None, chunksize=1):該函數(shù)類似于全局函數(shù) map(func, *iterables),只是該函數(shù)將會啟動多個線程,以異步方式立即對 iterables 執(zhí)行 map 處理。
shutdown(wait=True):關(guān)閉線程池。
程序?qū)?task 函數(shù)提交(submit)給線程池后,submit 方法會返回一個 Future 對象,F(xiàn)uture 類主要用于獲取線程任務(wù)函數(shù)的返回值。由于線程任務(wù)會在新線程中以異步方式執(zhí)行,因此,線程執(zhí)行的函數(shù)相當(dāng)于一個“將來完成”的任務(wù),所以 Python 使用 Future 來代表。
感謝各位的閱讀!關(guān)于“python線程池有什么優(yōu)點(diǎn)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。