python - 当我将 Django Celery apply_async 与 eta 一起使用时,它会立即完成工作

标签 python django celery django-celery celery-task

我查看了 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。非常感谢你

编辑:

  1. 我已尝试将 eta 更改为 countdown=180 但它仍在立即运行函数 add_number。我也尝试了更长的倒计时,但仍然立即运行
  2. 我试过@johnmustafis 的回答,但还是一样,任务立即运行
  3. 我也试过 @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/

相关文章:

Python从函数调用中的args的嵌套字典中提取值

python - 操作系统错误 : The CUDA lib64 path could not be located in/usr/lib64

javascript - Django、apidoc js 在 PUT 方法中添加什么?

python - RabbitMQ IOError : Socket closed

django - 在Django-Celery中停止/清除定期任务

django - 如何在 Django 中为 celery beat 设置不同的工作日/周末时间表?

Python - 大文件名重命名错误(Win 错误 3)

python - Matplotlib事件处理: when do they send matplotlib events and when Qt events

反向多对多关系的Django查询集

django - 使用django和south时如何初始化django数据库