1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
這里的問題是您正在ThreadPoolExecutor為每個(gè)頁面創(chuàng)建一個(gè)新頁面。要并行執(zhí)行操作,只創(chuàng)建一個(gè)ThreadPoolExecutor并使用它的map方法:
import concurrent.futures as cf
import requests
def search_posts(page):
page_url = f'https://jsonplaceholder.typicode.com/posts/{page}'
res = requests.get(page_url).json()
return res['title']
if __name__ == '__main__':
with cf.ThreadPoolExecutor() as ex:
results = ex.map(search_posts, range(1, 21))
for r in results:
print(r)
請(qǐng)注意,使用if __name__ == '__main__'包裝器是使您的代碼更具可移植性的好習(xí)慣。
使用線程時(shí)要記住一件事;python.org如果您使用的是 CPython(最常見的Python 實(shí)現(xiàn)),線程實(shí)際上不會(huì)并行運(yùn)行。
為了使內(nèi)存管理不那么復(fù)雜,一次只能有一個(gè)線程在 CPython 中執(zhí)行 Python 字節(jié)碼。這是由 CPython 中的全局解釋器鎖(“GIL”)強(qiáng)制執(zhí)行的。
好消息是,使用requests獲取網(wǎng)頁將花費(fèi)大部分時(shí)間使用網(wǎng)絡(luò) I/O。通常,GIL 是在 I/O 期間釋放的。
但是,如果您在輔助函數(shù)中進(jìn)行計(jì)算(即執(zhí)行 Python 字節(jié)碼),則應(yīng)改用 a ProcessPoolExecutor。
如果您使用 aProcessPoolExecutor并且在 ms-windows 上運(yùn)行,則需要if __name__ == '__main__'使用包裝器,因?yàn)樵谶@種情況下Python 必須能夠在沒有副作用的情況下運(yùn)行您的主程序。import
添加回答
舉報(bào)