我查看了 celery 文档并从中尝试了一些东西,但它不像示例那样工作。也许我在某些时候错了,如果我对以下代码有误,请给我一些指示
在 views.py 中我有这样的东西:
class Something(CreateView):
model = something
def form_valid(self, form):
obj = form.save(commit=False)
number = 5
test_limit = datetime.now() + timedelta(minutes=5)
testing_something.apply_async((obj, number), eta=test_limit)
obj.save()
在 celery 任务中我写了这样的东西:
@shared_task()
def add_number(obj, number):
base = Base.objects.get(id=1)
base.add = base.number + number
base.save()
return obj
我使用此代码的条件是在 CreateView 运行后 celery 立即运行,我的目标是在运行 Something CreateView 后每 5 分钟运行一次任务 add_number。非常感谢你
编辑:
- 我已尝试将
eta
更改为countdown=180
但它仍在立即运行函数add_number
。我也尝试了更长的倒计时,但仍然立即运行 - 我试过@johnmustafis 的回答,但还是一样,任务立即运行
- 我也试过 @dana 的回答,但还是一样,任务立即运行
最佳答案
Celery 默认使用 UTC 时间。
如果您的时区“落后于”UTC(UTC - HH:MM),datetime.now()
调用将返回一个“落后于”UTC 的时间戳,从而使您的任务立即执行。
您可以使用 datetime.utcnow()
相反:
test_limit = datetime.utcnow() + timedelta(minutes=5)
由于您使用的是 django,因此还有另一种选择:
如果您在 setting.py
中设置了 USE_TZ = True
,则您已启用 django timezone settings您可以使用 timezone.now()
而不是 datetime.utcnow()
:
from django.utils import timezone
...
test_limit = timezone.now() + timedelta(minutes=5)
关于python - 当我将 Django Celery apply_async 与 eta 一起使用时,它会立即完成工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45083908/