You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:54:26