芹菜任务是否应立即保存Django模型更新?

时间:2019-05-23 20:59:09

标签: django celery

我有一个芹菜任务,每次运行五分钟,以检查azure服务总线订阅主题中的消息。在这五分钟中,它每秒对服务总线执行ping操作以检查是否有消息,如果找到消息,则会将一些信息保存到数据库中。我已经注意到,仅在任务在五分钟标记结束时才发生对数据库的实际提交,而不是在调用model.save()方法时发生。

我想知道,添加一些代码以强制每次保存立即发生而不是在五分钟结束时执行是一个好主意吗?我正在考虑使用涉及原子事务的语句来完成此任务。

以下代码包含我的任务。我使用while循环使任务持续5分钟,在其中,我每秒对服务总线执行ping命令以获取消息,然后将其保存(如果找到)。

class CheckForUpdates(PeriodicTask):
    run_every = 300

    def run(self, queue_name='bus_queue'):
        end_task_time = _at_five_minutes()
        while time.time() < end_task_time:
            _wait_for_one_second()
            result = _check_service_bus_for_update()
            if _update_was_found(result):
                update = json.loads(result.body)
                logger.info("azure response body: ", update)
                # code that updates a django model
                model.save()

这是一个好的设计吗?可以让数据库提交累积5分钟,然后在5分钟结束时连续保存它们吗?我应该使用事务还是每次都强制立即保存任务?

1 个答案:

答案 0 :(得分:0)

我建议使用Django中模型的信号,这样您就可以等待侦听来自数据库django.db.models.signals的信号,并且可以使用钩子,这样您就可以等待事件发生,我将发布一个示例:

signal.py
from django.db.models.signals import post_save
from pay.models import RateDeck

@receiver(post_save, sender=RateDeck)
def post_save_RateDeck(sender, instance, **kwargs):
idpk = instance.pk
transaction.on_commit(lambda :uploadrate.apply_async(args=[idpk]))

因此,我希望您得到uploadrate是在事务完成时调用的函数transaction.on_commit在数据库中的事务完成时发送信号。