【发布时间】:2020-09-02 06:51:27
【问题描述】:
所以我有以下线程代码:
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = []
for url in total_links:
futures.append(executor.submit(process_url, input_url=url))
for future in concurrent.futures.as_completed(futures):
print('RESULT INSIDE')
result = future.result() #Returns None randomly
print(result)
records.append(result)
有时future.result() 返回无。下面是process_url函数:
def process_url(input_url):
res = None
sleep(0.07)
r = session.get(input_url, headers=headers, cookies=c, cert=cert, timeout=20)
if r.status_code == 200:
soup = BeautifulSoup(r.text, 'lxml')
res = get_status(soup)
print('Inside Process URL')
print(res)
print('======================')
return res
res 将始终有可用的数据,但不会在线程下获取该数据。我还补充说它是随机发生的,也就是说,如果我运行脚本 5 次,那么至少会返回一次 None。
【问题讨论】:
-
您能否将
process_url方法封装在try...exception块中,看看是否有任何异常被抛出并打印出来?在这种情况下,process_url可能会返回None。 -
@vshenoy 抱歉回复晚了。不,没有抛出异常。无一例外,它都显示了任何东西
-
在
process_url中添加一个else子句并在其中打印,我敢打赌你会看到它被打印出来,这意味着一些URL 返回了非200 状态。无论是那个,还是你没有显示的get_status,都可以返回 None。 -
@user4815162342 没有打印函数总是返回正确的值。
-
您是否也在
else子句中添加了它?您是否在get_status末尾添加了print(您仍然没有在问题中显示)?
标签: python python-multithreading threadpoolexecutor