Django:许多信号会降低性能吗?

时间:2012-02-14 16:25:05

标签: django django-signals django-debug-toolbar

debug_toolbar告诉我在前端和django-admin中有12个信号的44个接收器。这是正常的吗?这会降低性能吗?我有什么要根据你检查/修理的吗?

我可能用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-tagging的子类

1 个答案:

答案 0 :(得分: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的尺寸。

但是......我不会。反正还没有。请记住,“过早优化是所有邪恶的根源”!