我创建了一些post_save
信号,但我想知道以后是否会出现性能问题。例如,我有这样的事情:
def my_signal(sender, **kwargs):
# some minimal processing
posts = len(MyPosts.objects.filter(date__gte=variable))
if entries == "20":
# crate an object and assign it to the post's author.
post_save.connect(my_signal, sender=MyPosts)
假设我有一个非常繁忙的网站,每次创建帖子时都会触发。表演太糟糕了?有没有办法以更慢节奏的方式发射信号(可能是每天一次或每几次请求)?。
更新:
另一个问题:Django是否足够聪明,可以将.save()
调用与post_save
信号组合成一个数据库请求,还是在这里做了几个请求?
谢谢!
答案 0 :(得分:12)
信号处理程序对性能的影响当然取决于它们的功能。但是你应该知道它们在信号被触发时是同步执行的,所以如果处理程序中有很多动作(例如很多数据库调用),执行将会被延迟。
Django本身并没有为您提供另一个集成信号处理程序的机会,但如果有必要,您应该查看django-celery,这应该可以让您从一个异步调用任务 信号处理程序,例如......
答案 1 :(得分:8)
鉴于信号是同步执行的,信号的性能将在很大程度上取决于您连接的处理程序数以及调用时执行的代码。当post_save
信号触发时,原始插入/更新查询已经执行。如果要在查询执行之前对模型数据进行一些更改,则可以在pre_save
处理程序中执行此操作。某些情况也可以由数据库触发器处理。
不,Django没有“足够智能”将可能在任意数量的附加Python函数中执行的查询组合到单个查询中。当用户可能在您的用例描述中插入多个表时,它也无法将更新/插入组合到单个查询中。然而,Django可以在一次交易中处理这些事件。
django-celery,django-ztask,taskmaster等设计用于需要在请求/响应周期之外处理的更复杂的任务。对于每天只需要运行一次或两次的任务,您也可以编写自定义管理命令并使用cron。