Celery 和 transaction.atomic

2024-04-26

在一些 Django 视图中,我使用这样的模式来保存对模型的更改,然后根据新的模型数据进行一些异步更新(例如生成图像,进一步更改模型)。mytask是一个芹菜任务:

with transaction.atomic():
    mymodel.save()
    mytask.delay(mymodel.id).get()

问题是任务永远不会返回。查看 celery 的日志,任务已排队(我在日志中看到“已接收任务”),但它从未完成。如果我移动mytask.delay...get调用事务,它成功完成。

之间是否存在某些不兼容之处transaction.atomic还有芹菜?在 Django 1.6 或 1.7 中,我是否可以在一个事务下同时进行常规模型更新和来自单独任务流程的更新?

我的数据库是postgresql 9.1。我正在使用 celery==3.1.16 / django-celery 3.1.16,amqp==1.4.6,Django==1.6.7,kombu==3.0.23。 Broker后端是amqp,rabitmq作为队列。


As @dotz 提到 https://stackoverflow.com/a/31030040/2263517,生成异步任务并立即阻塞并继续等待直到完成几乎没有用处。

此外,如果你以这种方式附加它(.get()在最后),你可以确定mymodel刚刚进行的实例更改不会被您的工作人员看到,因为它们尚未提交 - 请记住您仍在内部atomic block.

你可以做的(从 Django 1.9 开始)是将任务延迟到提交当前活动事务之后,使用django.db.transaction.on_commit hook:

from django.db import transaction

with transaction.atomic():
    mymodel.save()
    transaction.on_commit(lambda:
        mytask.delay(mymodel.id))

我在我的作品中经常使用这种模式post_save触发新模型实例的某些处理的信号处理程序。例如:

from django.db import transaction
from django.db.models.signals import post_save
from django.dispatch import receiver
from . import models   # Your models defining some Order model
from . import tasks   # Your tasks defining a routine to process new instances

@receiver(post_save, sender=models.Order)
def new_order_callback(sender, instance, created, **kwargs):
    """ Automatically triggers processing of a new Order. """
    if created:
        transaction.on_commit(lambda:
            tasks.process_new_order.delay(instance.pk))

然而,这样你的任务不会被执行如果数据库事务失败。这通常是所需的行为,但请记住这一点。

Edit:以这种方式注册 on_commit celery 任务实际上更好(没有 lambda):

transaction.on_commit(tasks.process_new_order.s(instance.pk).delay)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Celery 和 transaction.atomic 的相关文章

随机推荐

  • 删除图像中小于 n 大小(噪声)的像素 - open CV python

    我正在尝试减少图像中的噪音 目前正在运行此代码 import numpy as np import argparse import cv2 from skimage import morphology Construct the argum
  • 如何在 Live() 上绑定滚动事件?

    不久前我为某人解决了一个问题希望他的文本区域变大 https stackoverflow com questions 4717635 jquery building an autoresizing textarea that doesnt
  • 如何用Java实现Kerberos协议转换? (S4U2自我)

    Edit 现在我知道我需要什么了 我需要在Java中实现Kerberos协议转换 S4U2Self Net 中有示例 但没有 Java 的示例 有这个第三方库Java 版 Quest 单点登录 http www quest com sing
  • 对 null/空值使用 bool.Parse 时出错

    我有一个使用管道运算符的表达式 该表达式将值转换为字符串 然后转换为布尔值 但有时原始值可能为空 当值为 null 时 如何使用模式匹配或其他方式假设 false type kv Dictionary
  • 如何切换 UITableView Cell 的选定状态

    我有一个带有自定义单元格的 UITableView 该单元格包含一个 UIImageView 和一个 UILabel 现在 当我第一次加载表格时 它会在每个单元格上加载相同的图像和不同的标签 这些标签是从 LabelArray 中获取的 现
  • 如何在c中创建信号量?

    我正在尝试重新创建一个 黑盒 库 在我的计算机科学课程中 当我们应该使用信号量时 在我们的纸质期末考试中 我们会得到一个 sem h 文件 有 3 个函数 一个用于创建具有初始数量令牌的新信号量 一个用于从信号量中取出令牌 一个用于将令牌放
  • Bootstrap 模态和传递值

    当我单击编辑时 id 应该传递到自己的页面 并且模式应该弹出 但这不起作用 请帮我 PHP 和 Bootstrap tr td td td a href gt Edit a td tr Modal div class modal fade
  • 使用 iTextSharp 和 PDFStamper 在 PDF 中使用不同的字体

    我正在使用 iTextSharp 加载现有 PDF 并使用 PdfStamper 添加文本 我想要完全控制文本 这意味着我想要能够控制字体 仅限 TrueType 字体大小和坐标 现在 我使用 ShowTextAligned 将文本添加到某
  • 根据文档,Django 1.8spectdb 命令看不到 PostgreSQL 视图

    我有一个带有 PostgreSQL 数据库的 Django 1 8 应用程序 我从命令行运行 django inspectdb 来检查模型的视图 但视图不会显示在模型输出中 这是版本输出 17 36 python well manage p
  • NSPredicate:获取每种类型之一

    我想创建一个NSFetchRequest对于这样的对象 The Object is Car其中有一个attribute color 我有四辆车 car1 color red car2 color red car3 color blue ca
  • 将数字格式设置为缩写数字

    我有一个数据库 其中有一列包含数字格式的值 例如 5 000 for 5k 86 600 for 86 6k 4 100 000 for 4 1m 在浏览器中显示时 它应该显示为 5000 的 5k 86 600 的 86 6k 等 我需要
  • 来自 URL 的 YouTube 视频 ID - Swift3

    基本上我有一个 Youtube URL 作为字符串 我想从该 URL 中提取视频 ID 我在 Objective C 中找到了一些代码 如下所示 NSError error NULL NSRegularExpression regex NS
  • Android 中的导航抽屉和 Activity

    我正在尝试中给出的导航抽屉 幻灯片菜单 本教程 http www androidhive info 2013 11 android sliding menu using navigation drawer 上面的链接和我的链接的区别在于 我
  • 如何在Elastic Beanstalk服务器上模拟发送周期性任务?

    我已经设置了 Elastic Beanstalk 服务器 工作层 它有一个 cron yaml 每小时运行一个任务 如下所示 version 1 cron name broadcast users url broadcast schedul
  • 有没有办法忽略 firebase crashlytics 统计数据中的静音/无声崩溃?

    Firebase crashlytics 可以选择静音我们认为无效或将由第三方库修复的崩溃 但我认为在计算无崩溃百分比等统计数据时 仍然会考虑到这些崩溃 有没有一种方法可以标记崩溃 使其完全被忽略或丢弃 并且不考虑任何这些统计数据计算 这不
  • 从数据框中删除稀有因子水平的优雅方法

    我想按因子对数据框进行子集化 我只想保留高于特定频率的因子水平 df lt data frame factor c rep a 5 rep b 5 rep c 2 variable rnorm 12 此代码创建数据框 factor vari
  • Flask SqlAlchemy 连接两个模型,无需外键 MYSQL

    我正在加入两个没有外键的模型 Models class Users db Model tablename Users userName db Column db String primary key True lastLogin db Co
  • 在连接中使用聚合函数时如何使用 Group By 子句?

    我想连接三个表并计算表 A 的总和 数量 我尝试了一些东西 得到了想要的输出 但我仍然对聚合函数和 Group By 子句感到困惑 在通过连接两个或多个表来计算总和值时 我们需要在 Group By 子句中提及哪些列以及为什么需要给出这些列
  • java.io.Console - 类似于与标准输入重定向兼容的实用程序?

    某些 Java 库中是否有实用程序类提供类似的便利设施java io Console http docs oracle com javase 6 docs api java io Console html但与输入的 Bash 管道重定向兼容
  • Celery 和 transaction.atomic

    在一些 Django 视图中 我使用这样的模式来保存对模型的更改 然后根据新的模型数据进行一些异步更新 例如生成图像 进一步更改模型 mytask是一个芹菜任务 with transaction atomic mymodel save my