Python如何监控循环运行时长并在超时时触发中断报错?
爬虫循环单次执行超时中断解决方案
以下针对Python场景给出可直接落地的实现方案:
方案1:基于signal模块实现(仅适用类Unix系统)
该方案实现最轻量,不需要额外依赖:
import signal import time # 自定义超时异常 class TimeoutException(Exception): pass def timeout_handler(signum, frame): raise TimeoutException("单次循环执行超过30秒,已中断") # 注册信号处理器 signal.signal(signal.SIGALRM, timeout_handler) # 你的爬虫循环 for target_url in url_list: try: # 设置30秒超时闹钟 signal.alarm(30) # 这里放你单次循环的爬虫逻辑 scrape_page(target_url) # 执行完成后取消闹钟 signal.alarm(0) except TimeoutException as e: print(f"处理{target_url}超时:{e}") # 可选:记录失败的url后续重试 failed_urls.append(target_url) continue
注意:这个方案不支持Windows系统,也不能在多线程场景下使用。
方案2:基于concurrent.futures实现(跨平台通用)
如果需要兼容Windows或者多线程场景,用线程池加超时控制的方式更稳妥:
from concurrent.futures import ThreadPoolExecutor, TimeoutError import time executor = ThreadPoolExecutor(max_workers=1) # 你的爬虫循环 for target_url in url_list: try: # 提交单次爬虫任务到线程池,设置30秒超时 future = executor.submit(scrape_page, target_url) result = future.result(timeout=30) # 处理返回的爬取结果 process_result(result) except TimeoutError: print(f"处理{target_url}超时,已中断") failed_urls.append(target_url) # 超时后取消未完成的任务 future.cancel() continue
注意:如果你的爬虫逻辑里有调用子进程的场景,需要额外处理子进程的回收逻辑,避免出现僵尸进程。
其他语言通用思路
如果用的不是Python,核心逻辑都是一致的:
- 为单次循环任务单独创建子线程/子进程执行
- 主线程同步计时,到达阈值后直接终止执行任务的子线程/子进程
- 捕获终止事件后记录异常,继续下一轮循环
内容的提问来源于stack exchange,提问作者Reichy
相关产品推荐
相关产品推荐

