Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 1, 2011 22:51:50

Cykooz
От:
Зарегистрирован: 2010-10-07
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Патч для zope.intid для решения проблемы с исключением NotYet

До не давних пор исключение NotYet при работе утилиты IIntIds не доставляло мне особых проблем, всегда удавалось решить проблему малой кровью.
Но сегодня пришлось всерьёз заняться пакетом zope.intid, что бы решить проблему с этим исключением в большинстве случаев.

Вот какие пути решения проблемы я реализовал:
- маркер INotIntIds - объекты с этим маркером игнорируются утилитой IIntIds;
- отложенная регистрация объектов в утилите IIntIds - объекты для которых возникает исключение NotYet сохраняются в специальный словарик, и в момент, когда один из их предков всё же будет добавлен в ZODB, они будут зарегистрированы.

Не реализованной осталась только функция очистки словарика отложенных объектов от оставшегося там мусора (например в случае если объекты так и не были добавлены в ZODB).
Пока что вижу только два варианта для вызова этого функционала:
- при закрытии текущей транзакции - к сожалению беглый поиск по исходникам не обнаружил вызов в этот момент какого либо события, на которое можно было бы подцепиться;
- обработчик события IEndRequestEvent - минус этого решения в том, что придётся добавить в зависимости пакет zope.app.publication.

Как вариант рассматриваю условную регистрацию в zcml обработчика события IEndRequestEvent в случае если установлен пакет zope.app.publication. Тогда можно будет не добавлять его в зависимость, а способ вызова обработчика при отсутствии zope.app.publication оставить на совесть разработчика.

Если у кого то есть по этому поводу какие то соображения - буду рад их почитать.

PS: Про исключение NotYet я более подробно писал тут



Отредактировано (Дек. 1, 2011 22:58:09)

Офлайн

#2 Дек. 2, 2011 14:36:22

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Патч для zope.intid для решения проблемы с исключением NotYet

> при закрытии текущей транзакции
Мне приходилось как-то решать такую задачу, с трудом нашёл сорцы :-). Вот фрагмент кода:

tm = transaction.interfaces.ITransactionManager(ctx)
tn = tm.get()
tn.addAfterCommitHook(onAfterCommit, args)
..bw



Офлайн

#3 Дек. 13, 2011 15:22:18

Cykooz
От:
Зарегистрирован: 2010-10-07
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Патч для zope.intid для решения проблемы с исключением NotYet

Решил проблему с другого бока. Стал использовать для хранения списка отложенных объектов WeakKeyDictionary и WeakSet. Это сразу решило проблему очистки мусора и теоретическую проблему утечки памяти. При этом это решение, как мне кажется более простое и надёжное, чем обработка каких либо событий.

Если кому то интересно, то можете взять исходники тут https://bitbucket.org/cykooz/zope.intid
Постараюсь в ближайшее время отправить в zope-dev запрос о включении моих изменений в основную ветку.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version