From e2ba855170902714ce38f4129abbe71209531457 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Beno=C3=AEt=20Pin?= Date: Tue, 27 Apr 2010 10:59:57 +0200 Subject: [PATCH 1/1] Debug de l'automate de tuilage MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit On importe Zope2 que dans le run() du thread. Ça permet la fermeture de la connexion à la zodb. On vire l'enregistrement du atexit. --- ImageManipulationTool.py | 4 +-- manipulation.py | 64 ++++++++++++++++++++++++++++------------ 2 files changed, 47 insertions(+), 21 deletions(-) diff --git a/ImageManipulationTool.py b/ImageManipulationTool.py index 5f9fa04..9c34580 100755 --- a/ImageManipulationTool.py +++ b/ImageManipulationTool.py @@ -28,9 +28,9 @@ from Products.MailHost.decorator import synchronized import time from logging import getLogger from threading import Lock +import weakref console = getLogger('[portal_image_manipulation]') - -queue_threads = {} +queue_threads = weakref.WeakValueDictionary() class ImageManipulationTool( UniqueObject, OrderedFolder) : diff --git a/manipulation.py b/manipulation.py index e27ab1e..8c057d6 100755 --- a/manipulation.py +++ b/manipulation.py @@ -14,8 +14,8 @@ $URL: http://svn.luxia.fr/svn/labo/projects/zope/Portfolio/trunk/manipulation.py import threading import logging import atexit -import time -import Zope2 +from types import StringTypes +#import Zope2 from math import ceil import transaction from ZODB.POSException import ConflictError @@ -28,20 +28,33 @@ class ImageQueueProcessorThread(threading.Thread) : """ __stopped = False - - def __init__(self, portal_path, itemPath): + + + def __init__(self, portal_path, itemsPath) : threading.Thread.__init__(self) - self.app = app = Zope2.app() - self.portal = portal = app.unrestrictedTraverse(portal_path) - self.imgTool = portal.portal_image_manipulation + self.portal_path = portal_path self.queue = [] - if itemPath : - self.queueAdd(itemPath) - else : - ctool = portal.portal_catalog - brains = ctool.unrestrictedSearchResults(portal_type='Photo', tiles_available=0) - for b in brains : - self.queueAdd(b.getPath()) + if isinstance(itemsPath, StringTypes) : + itemsPath = [itemsPath] + for i in itemsPath : + self.queueAdd(i) + +# def __init__(self, portal_path, itemPath): +# threading.Thread.__init__(self) +# self.app = app = Zope2.app() +# self.portal = portal = app.unrestrictedTraverse(portal_path) +# self.imgTool = portal.portal_image_manipulation +# self.queue = [] +# if itemPath : +# self.queueAdd(itemPath) +# else : +# ctool = portal.portal_catalog +# brains = ctool.unrestrictedSearchResults(portal_type='Photo', tiles_available=0) +# for b in brains : +# self.queueAdd(b.getPath()) + + def __del__(self) : + print "ayé, c'est la fin !" @property def queueSize(self) : @@ -52,21 +65,33 @@ class ImageQueueProcessorThread(threading.Thread) : def run(self) : console.info('process started.') - atexit.register(self.stop) + #atexit.register(self.stop) + import Zope2 + app = Zope2.app() while not self.__stopped and self.queueSize : - self._process() + self._process(app) + + con = app._p_jar + con.close() + #con.close() console.info('process finished.') + #print con + #print con.transaction_manager + def stop(self): console.info('process stopped.') self.__stopped = True - def _process(self) : + def _process(self, app) : path = self.queue.pop(0) + #import Zope2 + #app = Zope2.app() + try : - p = self.app.unrestrictedTraverse(path) + p = app.unrestrictedTraverse(path) except KeyError : console.warn('deleted during processing: %s' % path) return @@ -126,7 +151,8 @@ class ImageQueueProcessorThread(threading.Thread) : except ConflictError : console.warn('Resync after ZODB ConflicError') transaction.abort() - self.portal._p_jar.sync() + portal = app.unrestrictedTraverse(portal_path) + portal._p_jar.sync() self.queueAdd(path) return except : -- 2.20.1