1、使用好處
提高性能:由于減去了大量新建終止線程的費用,重用了線程資源;
適用場景:適用于處理大量突發(fā)請求或需要大量線程完成任務(wù),但實際任務(wù)處理時間短。
防御功能:可以有效避免系統(tǒng)因線程過多而導(dǎo)致系統(tǒng)負載過大而相應(yīng)變慢的問題。
代碼優(yōu)勢:使用線程池的語法比創(chuàng)建自己的線程更簡單。
2、實例
"""
@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] # 那鏈接和標題拿出來
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())
知識點補充:
線程池的使用
線程池的基類是 concurrent.futures 模塊中的 Executor,Executor 提供了兩個子類,即 ThreadPoolExecutor 和ProcessPoolExecutor,其中 ThreadPoolExecutor 用于創(chuàng)建線程池,而 ProcessPoolExecutor 用于創(chuàng)建進程池。
如果使用線程池/進程池來管理并發(fā)編程,那么只要將相應(yīng)的 task 函數(shù)提交給線程池/進程池,剩下的事情就由線程池/進程池來搞定。
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線程池的四種好處總結(jié)的文章就介紹到這了,更多相關(guān)python線程池的四種好處歸納內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python 線程池模塊之多線程操作代碼
- Python爬蟲之線程池的使用
- python爬蟲線程池案例詳解(梨視頻短視頻爬取)
- python線程池 ThreadPoolExecutor 的用法示例
- 實例代碼講解Python 線程池
- Python 如何創(chuàng)建一個線程池
- python線程池如何使用
- 解決python ThreadPoolExecutor 線程池中的異常捕獲問題
- Python定時器線程池原理詳解
- Python 使用threading+Queue實現(xiàn)線程池示例
- Python線程池的正確使用方法