我正在使用Django、Celery、RabbitMQ 和 postgreSQL。
我正在做你想做的事。
画中画:celery 和 flower
您需要一个 Celery conf 文件(在您的 settings.py 文件夹中):
你要添加的是beat_schedule:
app.conf.beat_schedule = {
'task-name': {
'task': 'myapp.tasks.task_name',
'schedule': crontab(minute=30, hour=5, day_of_week='mon-fri'),
},
}
这将在您的数据库中添加一个条目以执行task_name(周一至周五5:30),您可以直接更改您的设置(重新加载celery和celery beat之后)
我喜欢的是你可以很容易地添加重试机制,并且安全:
@app.task(bind=True, max_retries=50)
def task_name(self, entry_pk):
entry = Entry.objects.get(pk=entry_pk)
try:
entry.method()
except ValueError as e:
raise self.retry(exc=e, countdown=5 * 60, queue="punctual_queue")
当我的method() 提升ValueError 时,我将在 5 分钟内重新执行此方法,最多尝试 50 次。
好处是你可以在 Django admin 中访问数据库:
您可以通过flower检查任务是否执行(带有回溯):
我每天要执行超过 1000 个任务,你需要的是创建队列和工作者。
我为此使用了 10 名工人(为了将来扩大规模):
celery multi start 10 -A MYAPP -Q:1-3 recurring_queue,punctual_queue -Q:4,5 punctual_queue -Q recurring_queue --pidfile="%n.pid"
以及启动任务的守护进程:
celery -A MYAPP beat -S django --detach
这对你来说可能有点过头了,但他可以为你做更多的事情:
- 异步发送电子邮件(如果失败,您可以更正并重新发送电子邮件)
- 为用户上传和后处理异步
- 每一项需要时间但您不想等待的任务(您可以将需要完成的任务链接起来返回一个结果并在另一个任务中使用它)