Dieter Maurer wrote:
Max M wrote at 2005-6-27 15:53 +0200:
... So in a external method/module I have a function like this:
BUSY_STATE = 0 def sync_in_progress(busy=None): global BUSY_STATE if busy is None: return BUSY_STATE else: BUSY_STATE = busy
Note that this is likely to fail.
The module containing an External Method is maintained in the ZODB cache. As a consequence, each worker gets its own copy and you cannot synchronize via global variables of such modules.
Use a true Python module (note that Zope does not import the source file of an External Method; therefore, it is not inside a module in the Python sense) when you need synchronization via global module level variables.
I wrote a small tool and ended up with this: BUSY_STATE = 0 def sync_in_progress(busy=None): global BUSY_STATE print '----------------' print 'BUSY_STATE:', BUSY_STATE, 'busy:', busy print '' if not busy is None: BUSY_STATE = busy return BUSY_STATE class Syncer(UniqueObject, PropertyManager, SimpleItem.SimpleItem, ActionProviderBase): def redirect(self, url): self.REQUEST.RESPONSE.redirect(url) def reset(self): "reset" return repr(sync_in_progress(0)) def sync(self): "Syncs" print '##################' print 'sync start' if not sync_in_progress(): sync_in_progress(1) self.redirect('%s/sync_action' % self.absolute_url()) else: return 'SYNC: in progress' def sync_action(self): "sync_action" # do stuff sync_in_progress(1) self.sync_calendar() self.sync_email() sync_in_progress(0) return 'SYNC: done' It doesn't seem to work without the redirect. Which is the reason for having both a sync and a sync_action method. -- hilsen/regards Max M, Denmark http://www.mxm.dk/ IT's Mad Science