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

2024-04-28 12:25:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为Twitter开发一个bot,它每天同时检查用户的时间线,并搜索一条“每日Tweet”,从中解析数据、格式化数据,并将其作为Tweet从我的bot发送出去

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

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)

我最近尝试的是只在UTC 00:00运行一个每日计划任务,并向daily_mode_inspector函数添加一行代码,该函数每10秒运行一次,直到满足条件,然后停止

在测试我确信非常简单的代码时,我遇到了一个问题,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秒的间隔时,它将运行daily inspector代码几次,而且代码运行的时间越长,情况就越糟。我想知道我怎样才能使它运行我的函数10秒,而不会导致上面的胡说八道


Tags: 代码falsehelloworldinspectormodebot时间
1条回答
网友
1楼 · 发布于 2024-04-28 12:25:53

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

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

更新daily_inspector(),如下所示:

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

然后定义do\u例程如下:

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

相关问题 更多 >