我正在为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秒运行一次函数,而不会导致上面的废话。
答案 0 :(得分:2)
原因仅仅是因为您创建了一个递归函数,即一个调用自身的函数。
要修复此问题,请从要执行的调用中隔离要执行的例程。
按以下方式更新daily_inspector():
def daily_inspector():
schedule.every(10).seconds.do(do_routine)
然后定义do_routine如下:
def do_routine():
print('Hello World', utc_stamp())