我有以下代码:
我的问题是:如果check_running_job的函数引发异常并且没有在check_running_job中捕获它,那么它会导致运行check_running_job的线程死掉吗?因此,如果我将max worker作为3,在它死后,那么只有2个线程可以服务于将来的请求吗?
with futures.ThreadPoolExecutor(max_workers = setting.parallelism_of_job_checking) as te:
while True:
cursor.execute(sql)
result = fetch_rows_as_dict(cursor)
for x in result:
id = x["id"]
te.submit(check_running_job, id,)
time.sleep(10)
答案 0 :(得分:1)
ThreadPoolExecutor线程通过完成任务或引发异常干净地完成 ;一个引发的异常不会阻止该线程或阻止另一个工作者被分配给它,并且会将.done()
干净地设置为True,就像任务已正确完成一样。
(您可能已经意识到这一点,但是如果您尝试访问失败的任务的.return()
方法,则会引发其异常 - 因此应始终访问返回值try ... except
结构。如果您的代码需要知道任务是成功完成还是失败,这是一种方法。)