ThreadPoolExecutor(線程池)
線程池一些知識點:
- python中ThreadPoolExecutor(線程池)是concurrent.futures模塊下的,主線程中可以獲取某一個線程執行的狀態或者某一個任務執行的狀態及返回值。
- 通過submit返回的是一個future對象,它是一個未來可期的對象,通過它可以獲悉線程的狀態
- 通過submit提交函數到進程池中,submit(函數名,參數)
- 通過wait()判斷線程執行的狀態:wait(fs, timeout=None, return_when=ALL_COMPLETED),wait接受3個參數,fs表示執行的task序列;timeout表示等待的最長時間,超過這個時間即使線程未執行完成也將返回;return_when表示wait返回結果的條件,默認為ALL_COMPLETED全部執行完成再返回
- http的是IO請求,所以用線程
- 編寫方法一:直接返回處理
from concurrent.futures import ThreadPoolExecutor import requests pool = ThreadPoolExecutor(10) def task(url): response = requests.get(url) print(url,response) url_list = ( "https://www.bing.com", "https://www.shihu.com", "https://www.sina.com", "https://www.baidu.com", "https://www.cnblogs.com", "https://music.163.com/#" ) for url in url_list: pool.submit(task,url) pool.shutdown(wait=True)
result
https://www.bing.com <Response [200]> https://www.baidu.com <Response [200]> https://www.cnblogs.com <Response [200]> https://music.163.com/# <Response [200]> https://www.sina.com <Response [200]>
- 編寫方法二:通過回調函數進行處理
from concurrent.futures import ThreadPoolExecutor import requests pool = ThreadPoolExecutor(10) def task(url): response = requests.get(url) #下載頁面 return response def done(future,*args,**kwargs): response = future.result() #取得future對象進行操作 print(response.status_code,response.content) url_list = ( "https://www.bing.com", "https://www.jd.com", "https://www.sina.com", "https://www.baidu.com", "https://www.cnblogs.com", "https://music.163.com/#" ) for url in url_list: v = pool.submit(task,url) #獲得一個返回值,其實就是訪問url的響應 v.add_done_callback(done)
result
響應信息balabalabala ps:太多就不發了