Форум сайта python.su
0
До не давних пор исключение 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)
Офлайн
20
> при закрытии текущей транзакции
Мне приходилось как-то решать такую задачу, с трудом нашёл сорцы :-). Вот фрагмент кода:
tm = transaction.interfaces.ITransactionManager(ctx)
tn = tm.get()
tn.addAfterCommitHook(onAfterCommit, args)
Офлайн
0
Решил проблему с другого бока. Стал использовать для хранения списка отложенных объектов WeakKeyDictionary и WeakSet. Это сразу решило проблему очистки мусора и теоретическую проблему утечки памяти. При этом это решение, как мне кажется более простое и надёжное, чем обработка каких либо событий.
Если кому то интересно, то можете взять исходники тут https://bitbucket.org/cykooz/zope.intid
Постараюсь в ближайшее время отправить в zope-dev запрос о включении моих изменений в основную ветку.
Офлайн