django - Celery --击败 Heroku 与 Worker 和 Clock 进程

标签 django multithreading heroku celery clock

我有一个定期任务,我正在使用 worker 在 heroku procfile 上实现:

Procile

web: gunicorn voltbe2.wsgi --log-file - --log-level debug
worker: celery -A voltbe2 worker --beat -events -loglevel info 

任务.py
class PullXXXActivityTask(PeriodicTask):
    """
    A periodic task that fetch data every 1 mins.
    """
    run_every = timedelta(minutes=1)

    def run(self, **kwargs):
        abc= MyModel.objects.all()
        for rk in abc:
            rk.pull()
        logger = self.get_logger(**kwargs)
        logger.info("Running periodic task for XXX.")

        return True

对于这个周期性任务,我需要 --beat (我通过关闭它来检查,它不会重复任务)。所以,在某种程度上,--beat做时钟的工作( https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes )

我担心的是:如果我扩展 worker heroku ps:scale worker=2到 2x dynos,我看到日志中有两个节拍在 worker.1 和 worker.2 上运行:
 Aug 25 09:38:11 emstaging app/worker.2: [2014-08-25 16:38:11,580: INFO/Beat] Scheduler: Sending due task apps.notification.tasks.SendPushNotificationTask (apps.notification.tasks.SendPushNotificationTask)
Aug 25 09:38:20 emstaging app/worker.1: [2014-08-25 16:38:20,239: INFO/Beat] Scheduler: Sending due task apps.notification.tasks.SendPushNotificationTask (apps.notification.tasks.SendPushNotificationTask) 

显示的日志是针对不同的周期性任务,但关键是两个工作器 dynos 都从各自的时钟获取信号以执行相同的任务,而实际上应该有一个时钟在滴答作响,每隔 XX 秒决定做什么做,并将该任务交给负载最少的 worker.n测功机

更多关于为什么单时钟必不可少的信息在这里:https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes#custom-clock-processes

这是一个问题,如果是,如何避免这种情况?

最佳答案

你应该有一个单独的工作人员来处理节拍过程。

web: gunicorn voltbe2.wsgi --log-file - --log-level debug
worker: celery -A voltbe2 worker -events -loglevel info 
beat: celery -A voltbe2 beat 

现在,您可以在不影响第一个节拍的情况下扩展工作任务。

或者,如果您并不总是需要额外的进程,您可以继续在工作任务中使用 -B 但也有第二个任务 - 例如,extra_worker - 通常设置为 0 dynos,但您可以将其扩展为必要的。重要的是始终将任务与​​节拍保持在 1 个进程

关于django - Celery --击败 Heroku 与 Worker 和 Clock 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490542/

相关文章:

c# - 在多线程 UI 程序中获取 System.ArgumentOutOfRangeException

ruby-on-rails - 使用 Heroku 上的 Rails 解压缩文件并将其所有内容上传到 S3

python - Django:将 ManyToManyField 转换为 ForeignKey

django - 大于或等于forloop计数器Django模板

python - 服务器错误 500 Wagtail-admin

python - verse() 在调用时抛出 AttributeError

c++ - 可终止线程类中的编译错误

java - 使用 ThreadLocal 与 Atomic

ruby-on-rails - 在heroku上跟踪应用程序内存使用情况

ruby-on-rails - Heroku Rails应用程序崩溃