我正在使用Python的concurrent.futures
中的ThreadPoolExecutor
来并行地进行爬虫并将结果写入数据库。然而,我发现如果线程失败了,我无法获得任何信息。如何正确地知道哪些线程失败以及原因 (包括'正常'的 traceback)? 下面是一个最简工作示例。
import logging
logging.basicConfig(format='%(asctime)s %(message)s',
datefmt='%y-%m-%d %H:%M:%S', level=logging.INFO)
from concurrent.futures import ThreadPoolExecutor
def worker_bee(seed):
# sido is not defined intentionally to break the code
result = seed + sido
return result
# uncomment next line, and you will get the usual traceback
# worker_bee(1)
# ThreadPoolExecutor will not provide any traceback
logging.info('submitting all jobs to the queue')
with ThreadPoolExecutor(max_workers=4) as executor:
for seed in range(0,10):
executor.submit(worker_bee, seed)
logging.info(f'submitted, waiting for threads to finish')
如果我在worker_bee()
函数内导入logging并将消息定向到根记录器,那么我可以在最终的日志中看到这些消息。但我只能看到我定义的日志消息,而无法看到代码实际失败的回溯信息。
print(result.result())
需要缩进到with
上下文之下,因为它只在那里定义。 - kareem_emadwith
语句不会引入新的作用域。但是你的评论让我注意到了其他问题... - martineauprint()
调用只是为了调用result()
方法,否则并不重要或有意义。抱歉,我不知道有什么方法可以自动将所有异常发送到日志文件中,但我不是一个日志记录专家。 - martineaulogging.exception()
,因此几乎不算“自动化”。 - martineau