在Django的信号的性能(Performance of signals in Django)

2019-07-29 16:31发布

我设计了几个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信号转换成一个数据库请求,或者在这里做一对夫妇的请求?

谢谢!

Answer 1:

当然,你的信号处理程序对性能的影响取决于它们的功能。 但是,你应该知道他们是同步执行时,信号被触发,所以如果有很多动作在处理事情(例如很多的数据库调用的)的执行将被推迟的事实。

Django的本身并不为您提供另一个机会来整合信号处理程序,但如果需要的话,你应该看看到Django的芹菜 ,应使您能够从例如信号处理程序中异步调用任务...



Answer 2:

由于信号执行同步信号的性能将在你有多少处理器连接,哪些代码的调用时执行很大程度上依赖。 原来插入/更新查询将已经在执行时post_save信号火灾。 如果你想进行一些更改查询执行之前的模型数据,那么你可以做,在一个pre_save处理程序来代替。 有些情况下,也可以通过数据库触发器处理。

不,Django是不是“聪明就好”就可能在附着Python函数任意数量的执行到一个查询查询组合。 它也不是能够更新/插入合并成一个单一的查询时,你的使用情况介绍,他们可能插入多个表。 Django的可以在单个事务中但处理这些。

Django的芹菜,Django的ztask,工头和等被设计为需要的请求/响应循环外被处理更复杂的任务。 对于那些只需要运行一次或两次一天,你也可以只写一个自定义的管理命令,并使用cron任务。



文章来源: Performance of signals in Django