如何在启动Django应用程序时创建一个无限运行的单例芹菜任务?

时间:2015-05-05 14:46:27

标签: python django celery django-celery celerybeat

现在我有@sharedtask完全遵循以下代码: http://docs.celeryproject.org/en/latest/tutorials/task-cookbook.html#id1

以下调度程序设置:

CELERYBEAT_SCHEDULE = {
    'indefinite-task': {
        'task': 'app.tasks.indefinite_task',
        'schedule': timedelta(seconds=1),
    },
}

但我的两个工作人员似乎不止一次地运行任务,大概是因为一个工作者有并发线程?如何确保任务仅由单个工作线程上的单个线程运行一次?

我在shell中看到的示例:

11:00:43 worker.1 | [2015-05-05 15:00:43,444: DEBUG/Worker-1] app.tasks.indefinite_task[b8b0445c-91e6-4652-bd75-4c609149161f]: Acquiring lock
11:00:43 worker.1 | [2015-05-05 15:00:43,444: DEBUG/Worker-2] app.tasks.indefinite_task[b8b0445c-91e6-4652-bd75-4c609149161f]: Acquiring lock

编辑:我正在使用Procfile和heroku。

1 个答案:

答案 0 :(得分:0)

也许您想在其自己的工作进程中运行python脚本。

<强>实施例

worker: python indefinite_task.py

这可确保只为该工作程序运行一个任务。