2012-02-14 72 views
0

debug_toolbar告诉我,我在前端和django-admin中都有来自12个信号的44个接收器。这是正常的吗?这是否会降低性能?有什么我应该检查/修复吗?Django:很多信号会减慢性能吗?

我可能搞砸了pinax东西,我注意到也有很多,似乎重复的查询。 (检查并查询似乎是确定)

这是工具栏的输出:

class_prepared class setup_join_cache, ensure_default_manager, do_pending_lookups, prep_localized_datetime 
connection_created connection 
got_request_exception request _rollback_on_exception 
post_delete instance, using 
post_init instance TagAutocompleteTagItField._update, TagAutocompleteTagItField._update, ImageField.update_dimension_fields, ImageField.update_dimension_fields, ImageField.update_dimension_fields, TagAutocompleteTagItField._update, TagAutocompleteTagItField._update, TagAutocompleteTagItField._update, ImageField.update_dimension_fields, ImageField.update_dimension_fields, ImageField.update_dimension_fields, TagAutocompleteTagItField._update, TagAutocompleteTagItField._update, TagAutocompleteTagItField._update, ImageField.update_dimension_fields, ImageField.update_dimension_fields 
post_save instance, created, using, raw create_account, superuser_email_address, create_profile, signup_code_result_save, TagAutocompleteTagItField._save, TagAutocompleteTagItField._save, TagAutocompleteTagItField._save, TagAutocompleteTagItField._save, TagAutocompleteTagItField._save, TagAutocompleteTagItField._save, TagAutocompleteTagItField._save, TagAutocompleteTagItField._save 
post_syncdb app, verbosity, interactive, class, created_models 
pre_delete instance, using 
pre_init instance, args, kwargs GenericForeignKey.instance_pre_init, GenericForeignKey.instance_pre_init, GenericForeignKey.instance_pre_init, GenericForeignKey.instance_pre_init, GenericForeignKey.instance_pre_init, GenericForeignKey.instance_pre_init, GenericForeignKey.instance_pre_init, GenericForeignKey.instance_pre_init, GenericForeignKey.instance_pre_init 
pre_save instance, using, raw  
request_finished  close_connection 
request_started  reset_queries 

TagAutocompleteTagItField是Django的标记

回答

1

信号是同步的子类,所以他们会作出贡献到它们被调用的任何请求的处理时间。因此,绩效是否受到影响取决于这些职能所做的工作。

你的情况,似乎有很多事情在模型实例/保存您的到来领域。

这是不是默认的Django ImageField的连接所有这些信号吗?看起来你的项目中有一个信号在每个领域连接。

在任何情况下,这些TagAutocompleteTagItField和ImageFields似乎将大部分的信号。对于不具备这些领域将沿着检查模型中每个字段匹配的行模式的开销,是这样的:

tag_fields = [field for field in c._meta.fields if type(field) == TagAutocompleteTagItField] 

if tag_fields: 
    # Do stuff 

这不应该是坏真的。

如果你有这些字段的每吨它可能是值得禁用那些TagAutocompleteTagItField和ImageField的信号测试它。然后,如果它是一个漏洞,请检查是否可以将信号中的某些逻辑移动到其他位置,例如在访问它们时计算ImageField的尺寸。

但是..我不会。还没有。请记住,“过早优化是万恶之源”!

+0

感谢您的回答。我试图了解我的设置是否有任何问题。我还没有使用过信号......我注意到我写了一些不正确的东西,我有来自12个信号的44个接收器......这是什么意思?我会编辑我的问题来添加这个。 – nemesisdesign 2012-02-14 20:11:31

+0

我编辑了几个更详细的问题。 – nemesisdesign 2012-02-14 20:14:20

+1

这些字段可能每个在启动时都添加一个信号处理程序。 Django在多次注册同一个信号处理函数时没有问题,所以如果每个字段都注册一个,你会得到你在那里得到的结果。我没有使用pinax,所以我无法帮助更多。虽然我不会担心! – 2012-02-14 21:03:02