Django中信号的性能

Rob*_*ith 4 django performance signals

我创建了一些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)
Run Code Online (Sandbox Code Playgroud)

假设我有一个非常繁忙的网站,每次创建帖子时都会触发.表演太糟糕了?有没有办法以更慢节奏的方式发射信号(可能是每天一次或每几次请求)?

更新:

另一个问题是:Django是否足够聪明,可以.save()将post_save信号与信号复合成一个数据库请求,还是在这里做了几个请求?

谢谢!

Ber*_*ant 12

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

Django本身并没有为您提供另一个集成信号处理程序的机会,但如果有必要,您应该查看django-celery,它应该使您能够从信号处理程序中异步调用任务,例如......


Mar*_*vin 8

鉴于信号是同步执行的,信号的性能将在很大程度上取决于您连接的处理程序数以及调用时执行的代码.当post_save信号触发时,原始插入/更新查询将被执行.如果要在查询执行之前对模型数据进行一些更改,则可以在pre_save处理程序中执行此操作.某些情况也可以由数据库触发器处理.

不,Django没有"足够智能"将可能在任意数量的附加Python函数中执行的查询组合到单个查询中.当用户可能在您的用例描述中插入多个表时,它也无法将更新/插入组合到单个查询中.然而,Django可以在单个事务中处理这些事务.

django-celery,django-ztask,taskmaster等设计用于需要在请求/响应周期之外处理的更复杂的任务.对于每天只需要运行一次或两次的任务,您也可以编写自定义管理命令并使用cron.