gpt4 book ai didi

python - 为什么我的计划任务在前几次之后而不是按照计划的时间间隔以指数方式运行?

转载 作者:行者123 更新时间:2023-11-28 16:58:45 25 4
gpt4 key购买 nike

我正在为 Twitter 开发一个机器人,它每天在同一时间检查用户时间线并搜索“每日推文”,从中解析数据、格式化数据,然后将其作为我的机器人的推文发送。

目前我一直在使用 Pythons schedule 模块以 6 个不同的时间间隔(@ 1:19 分钟、1:30 分钟、2、4、10 和 20 分钟后 00:00 UTC)读取用户时间线以查看该用户何时以及是否发布了“每日推文”(通常在 5 分钟内发布,但最迟 20 分钟)。虽然此方法在技术上按预期工作,但我想更改代码,以便在用户发布每日推文的时间与我的机器人响应该推文的时间之间减少延迟。本质上,我希望每天在特定时间开始一个小时的类似守护进程的行为。

schedule.every().day.at('19:01:19').do(daily_mode_inspector, False)  #
schedule.every().day.at('19:01:30').do(daily_mode_inspector, False) #
schedule.every().day.at('19:02').do(daily_mode_inspector, False) # at intervals, check for the daily change
schedule.every().day.at('19:04').do(daily_mode_inspector, False) #
schedule.every().day.at('19:10').do(daily_mode_inspector, False) #
schedule.every().day.at('19:20').do(daily_mode_inspector, True) #

print('\nWaiting for next Daily Mode Inspection....')

while True:

schedule.run_pending()
time.sleep(1)

我最近尝试的是只在世界标准时间 00:00 运行一个每日计划任务,并将一行代码添加到每 10 秒运行一次直到满足条件的 daily_mode_inspector 函数,然后停止。

在测试我确信会非常简单的代码时,我遇到了一个问题,其中 schedule.every(10).seconds.do(daily_mode_inspector) 会产生一些不稳定的行为,因为它前两次正确运行(第一次预定时间,然后是 10 秒后),但在大约第三次运行时,它开始以指数方式开始运行,而不是线性运行,如果这有意义的话。为了更好地解释它,我以这种方式对其进行了测试:

import datetime
import schedule
import pytz

def utc_stamp():

utc_time = datetime.datetime.now(tz=pytz.UTC).strftime('%X')
return utc_time


def daily_inspector():

schedule.every(10).seconds.do(daily_inspector)
print('Hello World', utc_stamp())


schedule.every().day.at('14:30').do(daily_inspector)

while True:

schedule.run_pending()

产生这些结果:

Hello World 19:30:00
Hello World 19:30:10
Hello World 19:30:20
Hello World 19:30:20
Hello World 19:30:30
Hello World 19:30:30
Hello World 19:30:30
Hello World 19:30:30
Hello World 19:30:40
Hello World 19:30:40
Hello World 19:30:40
Hello World 19:30:40
Hello World 19:30:40
Hello World 19:30:40
Hello World 19:30:40

我的期望是代码每 10 秒运行一次,但实际情况是,在第二次运行后,当达到 10 秒间隔时,它会多次运行每日检查器代码,而且运行时间越长情况越糟代码运行。我想知道如何让它每 10 秒运行一次我的函数,而不会导致上面的废话。

最佳答案

原因很简单,因为您创建了一个递归函数,即调用自身的函数。

要修复它,请将要执行的例程与执行它的调用隔离开来。

更新 daily_inspector() 如下:

def daily_inspector():
schedule.every(10).seconds.do(do_routine)

然后定义do_routine如下:

def do_routine():
print('Hello World', utc_stamp())

关于python - 为什么我的计划任务在前几次之后而不是按照计划的时间间隔以指数方式运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55857161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com