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

时间:2019-04-25 20:29:07

标签: python

我正在为Twitter开发一个机器人,该机器人每天都在同一时间检查用户时间轴,并搜索“每日推文”,以从中解析数据,对其进行格式化并将其作为推文从我的机器人发送。

当前,我一直在使用Pythons Schedule模块以6个不同的时间间隔(@ UTC时间00:00后的1:19分钟,1:30分钟,2、4、10和20分钟)读取用户时间轴,以查看该用户何时以及是否发过推文(“ Daily Tweet”)(通常在5分钟内发推文,但已晚到20)。尽管此方法在技术上可以按预期工作,但我想更改代码,以便在用户发布每日tweet到我的漫游器响应该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秒运行一次,直到满足条件,然后停止。< / p>

在测试我确定将是非常简单的代码的过程中,我遇到了一个问题,其中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秒运行一次函数,而不会导致上面的废话。

1 个答案:

答案 0 :(得分:2)

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

要修复此问题,请从要执行的调用中隔离要执行的例程。

按以下方式更新daily_inspector():

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

然后定义do_routine如下:

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