You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:25:17