[Zope-dev] thread safety in external methods

Robin Becker robin@jessikat.demon.co.uk
Sat, 21 Aug 1999 15:38:40 +0100


In article <37BEAC6C.3DDDA7EC@digicool.com>, Michel Pelletier
<michel@digicool.com> writes
>Robin Becker wrote:
>> 
...
>> 
>
>When Zope starts up it imports all the modules containing external
>methods.  It might be possible to place code directly in the module for
>execution upon import.
>
>I'm not 100% certain, however, but I don't see why this standard python
>feature would have been disabled.
>
>-Michel
...
I tried that before and found I was getting a different version of my
module globals somehow when the function was called. I already had a job
queue set up, but it was being fooled somehow.

My example is as follows; the following is in root/Extensions (parallel
to root/var)

#### external method doesn't have proper globals
import time
JQ=0
class Thing:
        def __init__(self):
                global JQ
                self.I=JQ
                JQ=JQ+1

        def val(self):
                global JQ
                import time
                time.sleep(10)
                return "%s I=%d JQ=%d"%(str(self),self.I,JQ)

thing=Thing()

def drongo(self):
        return thing.val()

I add this as function test/drongo with function drongo

when I run this twice (nearly simultaneously) I get
<?.Thing instance at 1ee9aa0> I=0 JQ=1 from one and
<?.Thing instance at 1eb6e30> I=0 JQ=1 from the other

a third run gives
<?.Thing instance at 1eb6e30> I=0 JQ=1

so I had two versions of the global at one point.
>> Do I have to make a product or is there some easier way to do this.
>> --
>> Robin Becker
>> 
>> _______________________________________________
>> Zope-Dev maillist  -  Zope-Dev@zope.org
>> http://www.zope.org/mailman/listinfo/zope-dev
>> 
>> (To receive general Zope announcements, see:
>> http://www.zope.org/mailman/listinfo/zope-announce
>> 
>> For non-developer, user-level issues,
>> zope@zope.org, http://www.zope.org/mailman/listinfo/zope )

-- 
Robin Becker