【问题标题】:Heroku Scheduler delays several seconds when running a worker app?Heroku Scheduler 在运行工作应用程序时延迟几秒钟?
【发布时间】:2015-03-22 21:33:52
【问题描述】:

我目前使用附加调度程序在 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 的一些延迟问题,发现了一些关于空闲测功机和使用 New Relic 对这些测功机进行 ping 操作以防止它们空闲的内容,但这些内容最关注 Web 应用程序。还是同样的事情发生在这里?我什至如何使用 New Relic 来 ping 工作人员(一个没有可访问网址的应用程序)?

这真的令人沮丧,因为它不会发生在 cron 中。

【问题讨论】:

    标签: python heroku scheduled-tasks


    【解决方案1】:

    这是我从 Heroku 支持团队收到的回复:

    您好,我们的调度程序是尽力而为的服务,这意味着它可以 延迟几秒钟,或错过一些运行。如果您的应用依赖于 非常准确的计划流程,我们的建议是使用 自定义时钟进程。如果您有任何进一步的问题,请告诉我们 题。谢谢,达米安

    所以...我的解决方案。我只是按照本指南进行操作: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,效果很好。再也不耽误了!

    【讨论】:

      【解决方案2】:

      Heroku 调度程序无法达到毫秒级的精度——这根本不是它的工作原理。调度程序是 cron 的“松散”替代品,但不应指望该级别的精度。

      如果您需要对时间进行如此多的控制,您将需要运行一个工作进程——这样您将拥有一个专用的、长时间运行的进程,可以在确切的时间触发请求您需要的时间(不依赖于 Heroku 的 API 计时东西)。

      【讨论】:

        猜你喜欢
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 2018-04-08
        相关资源
        最近更新 更多