Джанго: Много ли сигналов замедляют работу? - PullRequest
0 голосов
/ 14 февраля 2012

debug_toolbar сообщает мне, что у меня есть 44 приемника из 12 сигналов как во внешнем интерфейсе, так и в django-admin.Это нормально?Это замедляет производительность?Есть ли что-нибудь, что я должен проверить / исправить, по вашему мнению?

Возможно, я что-то напутал с 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 Ответ

1 голос
/ 14 февраля 2012

Сигналы являются синхронными, поэтому они будут влиять на время обработки любого запроса, в котором они вызываются.Так что, зависит ли это от производительности, зависит от того, что делается в этих функциях.

В вашем случае, похоже, многое происходит при создании / сохранении модели из ваших полей.

Это не стандартный 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, когда к ним обращаются.

Но .. Я бы не стал.Во всяком случае, пока.Помните, что «преждевременная оптимизация - корень всего зла»!

...