Форум сайта python.su
Здравствуйте, может кто то сможет подсказать ссылку на толковую статью, поясняющую
достаточно просто что происходит с объектами в zope3.
То, что я сам начитался - что объекты живут в zodb, укладываются туда
при рестарте, на основании того, что написано в .zcml
Ну и при обработке запроса достаются с помошью утилиты cPickle.
но как то надо вот по-детальнее, вот по такой схеме
запрос->(создание экземпляра->десериализация(когда, зачем, первый раз там ничего нет)) - правильнее наверно сказать что это делает утилита cPickle и объект уже готовый ->тут публикация и все такое не так важное->сериализация->удаление
Вот, вот такое надо, всё что я рою - кусочное и обрывистое, не позволяющее представить полную картину.
Офлайн
misha111Неверно. Все объекты, которые регистрируются в ZCML: адаптеры, утилиты и т.д. - живут в памяти. В ZODB живут только объекты, которые наследуются от
То, что я сам начитался - что объекты живут в zodb, укладываются туда
при рестарте, на основании того, что написано в .zcml
persistent.Persistent
misha111Верно, в ZODB в виде узлов деревьев они физически представляют собою пиклы объектов.
Ну и при обработке запроса достаются с помошью утилиты cPickle.
misha111Для пользователя это в общем случае не важно. Объекты достаются из базы по запросу, например, через getUtility. При таком запросе может быть взят объект как из базы, так и из памяти (если он из ZCML и неперсистентный). В вашей схеме мне непонятно практически ничего.
запрос->(создание экземпляра->десериализация(когда, зачем, первый раз там ничего нет)) - правильнее наверно сказать что это делает утилита cPickle и объект уже готовый ->тут публикация и все такое не так важное->сериализация->удаление
Офлайн
да, спасибо, в принципе ответ понятен, но нужно вот именно то, что под словами “Для пользователя это в общем случае не важно”.
То еть вот мы в описанной вами последовательности дощли до щага 3, где нам понадобился объект, что при этом происходит?
Мы либо достаём его из zodb в память или уже берём из памяти, если он не персистентный (я так понимаю что если объект персистентный, но выполняются параллельно два запроса, где при первом он был поднят в память, то при втором он уже берётся из памяти? И один ли объект или он свой для каждого запроса - дубликат ли?), передаём на него контекст и реквест, он инициализируется, и дальше мы отрисовывем шаблон через view.какой то метод, а что происходит с этим объектом после того как он нам не нужен? Что происходит с объектом если он в памяти(не персистентный)? где он удаляется очищается и т.д.
Что происходит с объектом при этом всём и один ли объект на несколько запросов к нему?
Кроме того, например у нас есть какой то объект, он висит в памяти, и есть два параллельных обращения к нему, каждый со своим request от двух разных пользователей, как он себя ведёт?
Очень хотел бы чтоб меня попраыили, так как у меня очень много догадок, не знаю, насколько они соответствуют реальности
Отредактировано (Ноя. 24, 2010 11:01:28)
Офлайн
misha111zodb.org - тут как раз описано все, что нужно знать для работы с ZODB API. Zope имеет своего рода обертки для работы с этой БД, так что вы не работаете с БД напрямую, за вас все деалет zope. Управлять этим вы можете вручную через объект persistent.Persistent, либо с помощью генерации событий (например, ObjectCreatedEvent).
где нам понадобился объект, что при этом происходит?
misha111Если этот объект зарегистрирован в ZCML (то есть он является так называемым глобальным (он действует во всем zope instance), тогда как еще есть локальные в ZODB, и они могут быть найдены в зависимости от контекста, например в одной базе ZODB у вас лежат несколько сайтов, и вам не нужно, чтобы при поиске адаптера в одном сайте был найден неверный адаптер из другого сайта ), то он живет в памяти, оттуда и возьмется. Если же это локальный объект, произойдет его выборка из ZODB (как это делается, найдете по ссылке), то есть он поднимается в память, никаких дубликатов нет.
Мы либо достаём его из zodb в память или уже берём из памяти, если он не персистентный
Офлайн