1 回答

TA貢獻1829條經驗 獲得超9個贊
這里的問題是您正在ThreadPoolExecutor為每個頁面創建一個新頁面。要并行執行操作,只創建一個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)
請注意,使用if __name__ == '__main__'包裝器是使您的代碼更具可移植性的好習慣。
使用線程時要記住一件事;python.org如果您使用的是 CPython(最常見的Python 實現),線程實際上不會并行運行。
為了使內存管理不那么復雜,一次只能有一個線程在 CPython 中執行 Python 字節碼。這是由 CPython 中的全局解釋器鎖(“GIL”)強制執行的。
好消息是,使用requests獲取網頁將花費大部分時間使用網絡 I/O。通常,GIL 是在 I/O 期間釋放的。
但是,如果您在輔助函數中進行計算(即執行 Python 字節碼),則應改用 a ProcessPoolExecutor。
如果您使用 aProcessPoolExecutor并且在 ms-windows 上運行,則需要if __name__ == '__main__'使用包裝器,因為在這種情況下Python 必須能夠在沒有副作用的情況下運行您的主程序。import
添加回答
舉報