django - 如何将 django @transaction 装饰器应用于 celery 任务
问题描述
在我的项目中,我默认使用事务。我想为一些芹菜任务禁用它们。但是当我使用:
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)
我的芹菜任务仍然是做交易。而且看起来好像@transaction.non_atomic_requests
并@transaction.atomic_requests
没有申请。
UPD:试图交换订单,也不起作用。当我禁用DATABASES['default']['ATOMIC_REQUESTS'] = False
它时,它按预期工作
解决方案
transaction.non_atomic_requests
用于装饰视图,它不会对 Celery 任务产生任何影响。但事情是这样的:设置ATOMIC_REQUESTS
也不应该有任何影响!它在 Django 中评估的唯一地方是 in core.handlers.base.make_view_atomic
,它包装了视图。
因此,我的假设是您使用CELERY_TASK_ALWAYS_EAGER=True
(CELERY_ALWAYS_EAGER
在旧版本的 Celery 中)运行您的应用程序。在这种情况下,视图的事务是活动的。如果您将其设置为False
并在工作人员中运行您的任务,则应自动提交每个数据库操作。
推荐阅读
- html - phonegapp中的Html5视频全屏关闭
- r - 如何计算r中字符串中的段数?
- typescript - 错误 TS2300:重复标识符“RequestInfo”
- neo4j - 设置因果集群失败
- computer-vision - 微软计算机视觉 OCR - 拼凑来自区域的线条
- jenkins - 基于Jenkins中用户输入的条件参数
- swift - 如何在 Swift 中使用 PDFkit 搜索 PDF
- sql-server - SSIS 返回不正确的错误
- java - 哪种 MySQL 类型最好存储时间点信息 - Datetime 或 Timestamp
- amazon-web-services - 如何编码 Elastic Beanstalk 使用的 Cloudwatch 警报?