Django 芹菜——击败Heroku vs工人和时钟进程
我在heroku procfile上使用worker执行一项定期任务: ProcileDjango 芹菜——击败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
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
完成了时钟的工作()
我担心的是:如果我将workerheroku 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的文档里找不到。