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



我有一个芹菜任务,一次运行五分钟,以检查邮件中的Azure Service Bus订阅主题中的消息。在整个五分钟内,它每秒都会为服务总线检查一条消息,如果找到一条消息,则将一些信息保存到数据库中。我注意到,仅当任务以五分钟标记结束而不是在调用Model.Save((方法时,才发生对数据库的实际提交。

我想知道,添加一些代码迫使每个保存立即发生,而不是在五分钟结束时发生,这是一个好主意吗?我正在考虑使用涉及原子交易来实现这一目标的陈述。

下面的代码包含我的任务。我使用一段时间循环来保持任务进行5分钟,然后在其中,我每秒都会为消息提供服务总线,然后保存它们。

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分钟结束时连续保存它们?我应该使用交易,还是迫使任务每次保存?

我建议在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在完成数据库中的交易时发送信号。

相关内容

  • 没有找到相关文章