我目前使用附加调度程序在Heroku上托管了一个Python工作者应用程序。我将应用程序设置为在UTC时间凌晨5:00触发,但在应用程序实际触发之前需要10-20秒。这对我来说是个大问题,因为我需要我的应用程序尽可能接近开始时间执行。
从附加的日志语句中可以看出,Python应用程序直到预定时间过去近18秒才开始运行。
2015-01-23T05:00:18.395694+00:00 app[scheduler.9077]: 2015-01-23 05:00:18 [ MainThread ] [ INFO ] : -------- NEW LOG BLOCK ---------------'
我已经研究了Heroku的一些延迟问题,并找到了一些关于空转dynos的东西,并使用New Relic来ping这些dynos以防止它们空转但是那些最关注Web应用程序。或者这里发生了同样的事情?我怎么能用New Relic来ping一个worker(一个没有可达网址的应用程序)?
这真的令人沮丧,因为cron没有发生这种情况。
答案 0 :(得分:1)
使用Heroku调度程序无法达到毫秒精度 - 这根本不是它的工作原理。调度程序是一个松散的'替换cron,但不应该指望这个精确度。
如果你需要那么多时间控制你需要运行一个工作流程 - 这样你就可以有一个专门的,长时间运行的流程,可以启动在您需要的确切时间请求(不依赖于Heroku的API计时)。
答案 1 :(得分:0)
这是我从Heroku支持团队收到的回复:
嗨,我们的调度程序是尽力服务,这意味着它可以 延迟了几秒钟,或者错过了一些跑步。如果你的应用依赖 非常准确的预定流程,我们建议使用一个 定制时钟过程。如果您有任何进一步的信息,请告诉我们 题。谢谢,Damien
所以...我的解决方案。我只是按照本指南:https://devcenter.heroku.com/articles/clock-processes-python
然后我通过执行以下操作为我的Dyno添加了一个时钟进程:
heroku ps:scale clock=1
我将以下内容添加到我的procfile中:
clock: python clock.py
我安装了pip要求(并把它放在我的requirements.txt中):
apscheduler==3.0.1
在clock.py
:
import sys
sys.path.append('main')
from main import main
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
# Executes every night at 5:00am UTC time | 12:00am (midnight) Winston-Salem, NC time
@sched.scheduled_job('cron', hour=5)
def scheduled_job():
main()
sched.start()
然后我将所有这些都归还给了Heroku,它的效果非常好。没有延迟了!