【发布时间】:2016-04-21 15:22:31
【问题描述】:
我需要调用以下 2 个 apply_async 任务:
escalate.apply_async((e.id), countdown=3)
escalate.apply_async((e.id), countdown=3)
我的任务实现如下:
@app.task
def escalate(id, group):
escalation_email, created = EscalationEmail.objects.get_or_create()
escalation_email.send()
return 'sup email sent'
我使用以下命令运行该工作:
celery -A proj worker -l info --concurrency=10
问题是当我查看worker时,只收到1个任务,然后只有1个成功。此外,仅发送 1 封电子邮件。
第二个升级任务似乎大部分时间都在运行。
我如何确保这些任务都能 100% 可靠地触发?
【问题讨论】:
-
你怎么称呼芹菜?尝试添加 --concurrency=2
-
@SebastianSmolorz 我打电话给工人: celery -A proj worker -l info --concurrency=10 ,但它仍然只运行其中一项任务。当我启动两个不同的工人时,它会处理这两个任务。问题依然存在,如果调用了 3 个任务会发生什么,如果没有 2 个 worker,第 3 个任务会不会执行?
-
只有当您尝试发送 2 个相同的任务时才会出现此问题?尝试编写另一个虚拟任务并以相同的方式调用它。顺便说一句,您可以只使用
task.delay()而不是task.apply_async() -
@SebastianSmolorz 我需要在不同的时间发送任务,一个在 30 秒,一个在 5 分钟。我可以在 delay() 函数中设置倒计时参数吗?
-
抱歉,请阅读文档,延迟是 apply_async 的快捷方式,但它“...不支持执行选项”。那么当你从代码中稍微不同的地方用不同的倒计时调用它时呢?尝试使其工作并找出导致问题的原因。信息这么少,真的很难说。这不应该发生,但它可能是 Celery 本身的问题。
标签: python django celery django-celery