Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 芹菜——击败Heroku vs工人和时钟进程_Django_Multithreading_Heroku_Celery_Clock - Fatal编程技术网

Django 芹菜——击败Heroku vs工人和时钟进程

Django 芹菜——击败Heroku vs工人和时钟进程,django,multithreading,heroku,celery,clock,Django,Multithreading,Heroku,Celery,Clock,我在heroku procfile上使用worker执行一项定期任务: 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 fet

我在heroku procfile上使用worker执行一项定期任务:

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
完成了时钟的工作()

我担心的是:如果我将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) 
显示的日志是针对不同的周期性任务的,但关键点是两个worker dyno都从各自的时钟获取执行相同任务的信号,而事实上,应该有一个时钟滴答作响,每XX秒后决定执行什么,并将该任务交给负载最少的
worker.n
dyno

关于为什么单个时钟至关重要的更多信息,请参见:


这是一个问题吗?如果是的话,如何避免这个问题?

您应该为节拍过程指定一个单独的工作人员

web: gunicorn voltbe2.wsgi --log-file - --log-level debug
worker: celery -A voltbe2 worker -events -loglevel info 
beat: celery -A voltbe2 beat 
现在,您可以缩放辅助任务而不影响节拍任务


或者,如果您不总是需要额外的进程,您可以继续在worker任务中使用-B,但也可以使用第二个任务(例如,extra_worker),该任务通常设置为0 dynos,但您可以根据需要进行扩展。重要的是要始终保持任务的节拍在1个过程中

谢谢@Daniel。因此,如果我理解正确,只要任何Procfile进程发出一个“节拍”,它就会在整个应用程序中传播,所有工作人员都能听到这个“节拍”?heroku tht上有没有医生解释过这一点?这与heroku无关,也不是其他工人正在听的节拍。相反,“beat”作业只是将所有到期的作业放在队列中,然后工人以完全正常的方式提取它们。@DanielRoseman感谢您的回答,请您提供一个参考以供进一步阅读。。我在heroku的文档里找不到。