如何创建在启动 Django 应用程序时无限期运行的单例 celery 任务?

How do you create a singleton celery task that runs indefinitely upon starting a Django application?

现在我有一个 @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。

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

例如:

worker: python indefinite_task.py

这确保该工作人员只有一项任务 运行。