本文目录导读:

- 使用
sys.exit()(适用于非卡死情况) - 使用
os._exit()(强制立即退出) - 使用信号处理(SIGINT)
- 多线程/多进程中的终止方法
- 超时控制装饰器
- 使用
multiprocessing控制超时 - 使用
concurrent.futures超时控制 - 通用强制终止函数
- 注意事项:
在Python中,有几种方法可以强制终止卡死的脚本:
使用 sys.exit()(适用于非卡死情况)
import sys sys.exit(0) # 正常退出 sys.exit(1) # 异常退出
使用 os._exit()(强制立即退出)
import os os._exit(0) # 立即终止进程,不执行清理操作
使用信号处理(SIGINT)
import signal import os # 发送中断信号给当前进程 os.kill(os.getpid(), signal.SIGINT)
多线程/多进程中的终止方法
对于线程:
import threading
import time
def long_running_task():
time.sleep(100) # 模拟卡死
thread = threading.Thread(target=long_running_task)
thread.daemon = True # 设置为守护线程
thread.start()
# 主程序退出时,守护线程会自动终止
# 或者使用 threading.Event 来控制
对于子进程:
import subprocess import time # 启动子进程 proc = subprocess.Popen(['python', 'long_script.py']) # 超时后终止 time.sleep(5) proc.terminate() # 发送 SIGTERM # 或强制杀死 proc.kill() # 发送 SIGKILL
超时控制装饰器
import signal
import functools
class TimeoutError(Exception):
pass
def timeout(seconds):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
def handler(signum, frame):
raise TimeoutError("Function timed out")
# 设置信号处理器
signal.signal(signal.SIGALRM, handler)
signal.alarm(seconds)
try:
result = func(*args, **kwargs)
finally:
signal.alarm(0) # 取消闹钟
return result
return wrapper
return decorator
# 使用示例
@timeout(5) # 5秒超时
def potentially_blocking_task():
while True:
pass # 卡死在这里
try:
potentially_blocking_task()
except TimeoutError:
print("任务超时,已终止")
使用 multiprocessing 控制超时
from multiprocessing import Process
import time
def long_task():
while True:
pass # 卡死
if __name__ == '__main__':
p = Process(target=long_task)
p.start()
# 等待5秒
time.sleep(5)
if p.is_alive():
print("进程卡死,正在终止...")
p.terminate() # 终止进程
p.join() # 等待进程结束
使用 concurrent.futures 超时控制
from concurrent.futures import ThreadPoolExecutor, TimeoutError
import time
def blocking_task():
while True:
pass
with ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(blocking_task)
try:
result = future.result(timeout=5) # 5秒超时
except TimeoutError:
print("任务超时")
future.cancel() # 尝试取消
通用强制终止函数
import os
import signal
import sys
import threading
def force_terminate(delay=0.1):
"""强制终止当前脚本"""
def terminate():
time.sleep(delay)
os._exit(1)
# 在新线程中执行强制退出
t = threading.Thread(target=terminate, daemon=True)
t.start()
# 尝试正常退出
sys.exit(1)
# 使用示例
try:
while True: # 卡死循环
pass
except KeyboardInterrupt:
print("检测到中断,强制退出...")
force_terminate()
注意事项:
os._exit()是最强制的方法,但不执行清理操作sys.exit()会抛出SystemExit异常,可以被捕获- 对于多线程程序,建议使用守护线程或事件机制
- 对于外部进程,使用
terminate()或kill()方法 - 信号处理在 Windows 上可能不适用
选择哪种方法取决于你的具体场景和需求,最常用的是 sys.exit() 配合异常处理,或者使用 multiprocessing 的进程管理功能。