提高效能:由於減去了大量新建終止執行緒的費用,重用了執行緒資源;
適用場景:適用於處理大量突發請求或需要大量執行緒完成任務,但實際任務處理時間短。
防禦功能:可以有效避免系統因執行緒過多而導致系統負載過大而相應變慢的問題。
**優勢:使用執行緒池的語法比建立自己的執行緒更簡單。
"""@file : 004-執行緒池的使用.py
@author : xiaolu
@email : [email protected]
@time : 2021-02-01
"""import concurrent.futures
import requests
from bs4 import beautifulsoup
def craw(url):
# 爬取網頁內容
程式設計客棧 r = requests.get(url)
return r.text
def parse(html):
# 解析其中的內容
soup = beautifulsoup(html, "html.parser")
links = soup.find_all("a", class_="post-item-title")
return [(link["href"], link.get_text()) for link www.cppcns.comin links] # 那鏈結和標題拿出來
if __name__ == '__main__':
# 待爬取的網頁鏈結
urls = [
"".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, h程式設計客棧tml 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 用於建立執行緒池,而 processpoolexecutor 用於建立程序池。
如果使用執行緒池/程序池來管理併發程式設計,那麼只要將相應的 task 函式提交給執行緒池/程序池,剩下的事情就由執行緒池/程序池來搞定。
exectuor 提供了如下常用方法:
submit(fn, *args, **kwargs):將 fn 函式提交給執行緒池。*args 代表傳給 fn 函式的引數,*kwargs 代表以關鍵字引數的形式為 fn 函式傳入引數。
map(func, *iterables, timeout=none, chunksize=1):該函式類似於全域性函式 map(func, *iterables),只是該函式將會啟動多個執行緒,以非同步方式立即對 itpmjezwpfferables 執行 map 處理。
shutdown(wait=true):關閉執行緒池。
程式將 task 函式提交(submit)給執行緒池後,submit 方法會返回乙個 future 物件,future 類主要用於獲取執行緒任務函式的返回值。由於執行緒任務會在新執行緒中以非同步方式執行,因此,執行緒執行的函式相當於乙個「將來完成」的任務,所以 python 使用 future 來代表。
執行緒池的好處及四種形式
執行緒池 executors 如果併發的執行緒數量很多,並且每個執行緒都是執行乙個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低 系統的效率,因為頻繁建立執行緒和銷毀執行緒需要時間.執行緒池就是乙個容納多個執行緒的容器,池中的執行緒可以反覆使用,省去了頻繁建立執行緒物件的操作,節省了大量的時...
四種執行緒池
其他執行緒池 核心執行緒 執行緒池大小 佇列策略 newcachedthreadpool integer.max value synchronousqueue newfixedthreadpool 建立時可以設定引數 建立時可以設定引數 linkedblockingqueue newschedule...
四種執行緒池
threadpoolexecutor的引數 int coresize,核心執行緒 int maxsize,最大執行緒 long time,空閒執行緒超時時間,超時後銷毀 timeunit 空閒時間單位 blockingqueue taskqueue,存放任務的佇列,threadfactory thr...