Python ThreadPool线程调用sys.exit()后程序无法终止问题排查
问题分析与解决方案
问题根源
你代码里的sys.exit()在ThreadPool的工作线程中调用时,会抛出SystemExit异常。当主线程执行result.get()时,这个异常会被重新抛出,而你的代码没有捕获该异常,导致主线程直接终止,根本没机会执行到print('BYE')。
你觉得程序“一直无法停止”,大概率是因为主线程因未捕获的SystemExit直接退出,而非真的陷入无限循环。
解决方案
如果你只想终止当前线程且不影响主线程运行,别用sys.exit(),改用以下方式:
方式一:正常返回结束任务
这是最安全的方式,直接用return结束线程任务:
def handle_ip(ip_address): print('Child Thread') # Visit Web Page etc... return # 结束当前线程任务,主线程可正常获取结果
方式二:捕获SystemExit异常(若必须用sys.exit())
如果你的实际逻辑中不得不调用sys.exit(),可以在任务内部捕获该异常并返回,避免主线程被终止:
import sys from multiprocessing.pool import ThreadPool def handle_ip(ip_address): print('Child Thread') # Visit Web Page etc... try: sys.exit() except SystemExit: return print('HI') ip_addresses = ['1234'] pool = ThreadPool(processes=6) p_results = [pool.apply_async(handle_ip, (ip,)) for ip in ip_addresses] for result in p_results: result.get() print('BYE')
这样修改后,主线程能正常执行到print('BYE'),程序也会正常终止。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

