本文目录导读:

- 使用
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 的进程管理功能。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播