如何修复ThreadPoolExecutor仅返回最后一个关键词执行结果的问题
问题原因及修复方案
核心问题梳理
- 任务提交逻辑错误:
executor.submit()每次仅支持提交单个任务,你的代码仅提交了1次任务,直接把完整的keyword_list作为参数传给了查询方法,而非为每个关键词单独提交处理任务。 - 方法名拼写错误:类中定义的查询方法名为
find_kewword(多输入了一个w),调用时写的是find_keyword,属于笔误会导致方法找不到报错。 - 线程安全隐患:
requests.Session不是线程安全的,多线程共用同一个Session实例会导致请求、响应数据错乱,这也是你只能拿到最后一个关键词对应结果的核心诱因。
修复后的代码示例
首先修正类的实现,避免共用非线程安全的Session:
import requests from concurrent.futures import ThreadPoolExecutor class AllFind(): # 移除全局Session初始化,每个请求单独创建Session保证线程安全 def find_keyword(self, keyword): session = requests.Session() url = "https://xxxxxxxx.yy" params = { "keyword" : keyword, "version" : 5, } res = session.get(url, params=params) res_count = res.json().get("count") session.close() return res_count
然后修正线程池调用逻辑,为每个关键词单独提交任务:
obj = AllFind() keyword_list = [1,23,4,5,6] results = [] with ThreadPoolExecutor(max_workers=5) as executor: # 循环为每个关键词提交任务 tasks = [executor.submit(obj.find_keyword, kw) for kw in keyword_list] # 按顺序收集所有任务的返回结果 for future in tasks: results.append(future.result()) # 最终results顺序和keyword_list顺序一一对应 print(results)
内容的提问来源于stack exchange,提问作者kwsong0314
相关产品推荐
相关产品推荐

