如何将 django @transaction 装饰器应用于 celery 任务
How to apply django @transaction decorator to celery task
在我的项目中我默认使用事务。我想为一些芹菜任务禁用它们。但是当我使用:
from django.db import transaction
@transaction.non_atomic_requests
@app.task(bind=True, name='my_task')
def tasks_monitor(task):
m = MyModel.objects.get(id=1)
m.value = 5
m.save()
time.sleep(40)
我的celery任务还是做交易。看起来 @transaction.non_atomic_requests
和 @transaction.atomic_requests
不适用。
UPD: 正在尝试调换顺序,但也不起作用。
当我禁用 DATABASES['default']['ATOMIC_REQUESTS'] = False
它按预期工作
transaction.non_atomic_requests
是为了装饰视图,它不会对 Celery 任务有任何影响。但问题是:设置 ATOMIC_REQUESTS
也不应该有任何效果!它在 Django 中唯一被评估的地方是 core.handlers.base.make_view_atomic
,它包装了视图。
因此,我的假设是您 运行 您的应用程序具有 CELERY_TASK_ALWAYS_EAGER=True
(CELERY_ALWAYS_EAGER
在旧版本的 Celery 中)。在这种情况下,视图的事务是活动的。如果您将它设置为 False
和 运行 您在工作人员中的任务,则每个数据库操作都应自动执行。
在我的项目中我默认使用事务。我想为一些芹菜任务禁用它们。但是当我使用:
from django.db import transaction
@transaction.non_atomic_requests
@app.task(bind=True, name='my_task')
def tasks_monitor(task):
m = MyModel.objects.get(id=1)
m.value = 5
m.save()
time.sleep(40)
我的celery任务还是做交易。看起来 @transaction.non_atomic_requests
和 @transaction.atomic_requests
不适用。
UPD: 正在尝试调换顺序,但也不起作用。
当我禁用 DATABASES['default']['ATOMIC_REQUESTS'] = False
它按预期工作
transaction.non_atomic_requests
是为了装饰视图,它不会对 Celery 任务有任何影响。但问题是:设置 ATOMIC_REQUESTS
也不应该有任何效果!它在 Django 中唯一被评估的地方是 core.handlers.base.make_view_atomic
,它包装了视图。
因此,我的假设是您 运行 您的应用程序具有 CELERY_TASK_ALWAYS_EAGER=True
(CELERY_ALWAYS_EAGER
在旧版本的 Celery 中)。在这种情况下,视图的事务是活动的。如果您将它设置为 False
和 运行 您在工作人员中的任务,则每个数据库操作都应自动执行。