我有一个芹菜任务,一次运行五分钟,以检查邮件中的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
在完成数据库中的交易时发送信号。