【发布时间】:2014-10-18 21:02:52
【问题描述】:
我有一个定期任务,我正在使用 worker 对 heroku procfile 实施:
规范
web: gunicorn voltbe2.wsgi --log-file - --log-level debug
worker: celery -A voltbe2 worker --beat -events -loglevel info
tasks.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)
我担心的是:如果我将工作人员 heroku ps:scale worker=2 缩放到 2 倍 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)
显示的日志是针对不同的周期性任务,但关键是两个工作测功机都从各自的时钟获取信号以执行相同的任务,而实际上应该有一个时钟在每 XX 秒后滴答作响决定要做什么,并将该任务交给负载最少的worker.n dyno
更多关于为什么单个时钟必不可少的信息在这里:https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes#custom-clock-processes
这是一个问题吗?如果是,如何避免?
【问题讨论】:
标签: django multithreading heroku celery clock