如何让Python函数自动运行恰好2小时?非手动中断实现方案
问题:如何让斐波那契函数恰好运行2小时(无需手动中断)
需求:让指定函数运行恰好2小时,不希望手动中断该函数。现有一个生成斐波那契序列的函数
fib(),代码如下:
def fib(): sequence = [0,1] while True: sequence.append(sequence[-1]+sequence[-2]) return sequence
已知可通过Python的time库实现该需求,示例代码如下:
import time def fib(): sequence = [0,1] tic = time.time() while True: sequence.append(sequence[-1]+sequence[-2]) toc = time.time() if toc-tic> 2*60*60: # reaching two hours break return sequence
现咨询:是否存在其他Python实现方案?
其他实现方案
1. 使用time.perf_counter()(更精确的计时)
time.perf_counter()是专门用于测量时间间隔的高精度函数,比time.time()更稳定,适合长时间运行的计时场景:
import time def fib(): sequence = [0, 1] start_time = time.perf_counter() duration = 2 * 60 * 60 # 2小时 while time.perf_counter() - start_time < duration: sequence.append(sequence[-1] + sequence[-2]) return sequence
2. 使用threading.Timer实现异步中断
利用线程定时器在指定时间后触发中断信号,避免在循环内重复检查时间,减少额外开销:
import threading import signal def fib(): sequence = [0, 1] # 设置2小时后发送中断信号 timer = threading.Timer(2*60*60, lambda: signal.raise_signal(signal.SIGINT)) timer.start() try: while True: sequence.append(sequence[-1] + sequence[-2]) except KeyboardInterrupt: timer.cancel() return sequence
3. 使用datetime模块计算结束时间
通过计算未来的结束时间点,直接对比当前时间是否超时,代码可读性更强:
from datetime import datetime, timedelta def fib(): sequence = [0, 1] end_time = datetime.now() + timedelta(hours=2) while datetime.now() < end_time: sequence.append(sequence[-1] + sequence[-2]) return sequence
4. 使用sched事件调度器
利用Python内置的调度器安排终止事件,适合需要同时处理其他调度任务的场景:
import sched import time def stop_fib(scheduler, sequence): scheduler.cancel(scheduler.queue[0]) raise StopIteration(sequence) def fib(): sequence = [0, 1] scheduler = sched.scheduler(time.time, time.sleep) # 安排2小时后执行终止函数 scheduler.enter(2*60*60, 1, stop_fib, argument=(scheduler, sequence)) try: while True: sequence.append(sequence[-1] + sequence[-2]) scheduler.run(blocking=False) except StopIteration as e: return e.args[0]
内容的提问来源于stack exchange,提问作者Mohsen_Fatemi
相关产品推荐
相关产品推荐

