Python 控制程序超时的核心方法是强制中断阻塞的代码,最常用且安全的是  threading.Timer  线程定时器,复杂场景可使用  signal  信号(限 Unix 系统)或  concurrent.futures  线程池。

方法1:threading.Timer(通用、跨平台)

通过启动一个定时器线程,超时后触发自定义函数(如抛出异常)来中断主逻辑,适用于几乎所有场景。

python

import threading
import time

def timeout_handler():

"""超时后执行的函数,这里直接抛出异常终止程序"""
raise Exception("程序超时!已强制终止")

1. 设置超时时间(单位:秒)

timeout_seconds = 5

2. 启动定时器:超时后调用 timeout_handler

timer = threading.Timer(timeout_seconds, timeout_handler)
timer.start()

try:

# -------------- 替换为你的目标代码(如下载、等待等)--------------
print("开始执行任务,超时时间5秒...")
time.sleep(10)  # 模拟耗时超过超时时间的任务
print("任务正常完成(此句不会执行,因为会超时)")

finally:

# 3. 若任务提前完成,取消定时器(避免误触发)
timer.cancel()

 

方法2:concurrent.futures(适合函数级超时)

用线程池执行目标函数,直接通过  result()  方法设置超时时间,代码更简洁,适合给单个函数加超时。

python

from concurrent.futures import ThreadPoolExecutor
import time

def target_task():

"""需要控制超时的目标函数"""
print("任务开始...")
time.sleep(10)  # 模拟耗时任务
return "任务完成结果"

1. 创建线程池(仅1个线程)

with ThreadPoolExecutor(max_workers=1) as executor:

# 2. 提交任务并设置超时时间(5秒)
future = executor.submit(target_task)
try:
    # 3. 等待结果,超时则抛出 TimeoutError
    result = future.result(timeout=5)
    print("任务结果:", result)
except TimeoutError:
    print("任务超时!")

 

方法3:signal(仅 Unix 系统,如 Linux/macOS)

利用系统信号机制,超时后发送  SIGALRM  信号终止程序,效率高但不支持 Windows。

python

import signal
import time

def timeout_handler(signum, frame):

raise Exception("程序超时(signal 触发)")

1. 注册信号:超时后调用 timeout_handler

signal.signal(signal.SIGALRM, timeout_handler)

2. 设置超时时间(5秒)

signal.alarm(5)

try:

print("任务开始,超时5秒...")
time.sleep(10)  # 模拟超时任务
print("任务完成(不会执行)")

except Exception as e:

print(e)

finally:

# 3. 任务完成后取消信号(避免误触发)
signal.alarm(0)

 

需要我针对你的具体场景(比如之前的 VLC 播放控制),写一个带超时功能的完整示例代码吗?你只需告诉我具体超时时间即可。

标签: none

添加新评论