5

我已经创建了一些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信号的调用组合到一个数据库请求中,还是在这里执行几个请求?

谢谢!

4

2 回答 2

13

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

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

于 2012-05-31T19:55:57.753 回答
8

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

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

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

于 2012-06-05T18:13:25.810 回答