Найти - Пользователи
Полная версия: Патч для zope.intid для решения проблемы с исключением NotYet
Начало » Zope/Plone/Bluebream » Патч для zope.intid для решения проблемы с исключением NotYet
1
Cykooz
До не давних пор исключение NotYet при работе утилиты IIntIds не доставляло мне особых проблем, всегда удавалось решить проблему малой кровью.
Но сегодня пришлось всерьёз заняться пакетом zope.intid, что бы решить проблему с этим исключением в большинстве случаев.

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

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

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

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

PS: Про исключение NotYet я более подробно писал тут
bw
> при закрытии текущей транзакции
Мне приходилось как-то решать такую задачу, с трудом нашёл сорцы :-). Вот фрагмент кода:
tm = transaction.interfaces.ITransactionManager(ctx)
tn = tm.get()
tn.addAfterCommitHook(onAfterCommit, args)
..bw
Cykooz
Решил проблему с другого бока. Стал использовать для хранения списка отложенных объектов WeakKeyDictionary и WeakSet. Это сразу решило проблему очистки мусора и теоретическую проблему утечки памяти. При этом это решение, как мне кажется более простое и надёжное, чем обработка каких либо событий.

Если кому то интересно, то можете взять исходники тут https://bitbucket.org/cykooz/zope.intid
Постараюсь в ближайшее время отправить в zope-dev запрос о включении моих изменений в основную ветку.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB