Robin Becker wrote:
How do I do thread safety inside an External method.
I want to access a global singleton as
def __ZGA(): if not hasattr(sys.modules['__main__'],'__ZGA'): #unsafe here... Z=ZGA_calculator() # initialise things to do with Z sys.modules['__main__'].__dict__['__ZGA']=Z return sys.modules['__main__'].__dict__['__ZGA']
the problem is controlling access to sys.modules['__main__'].__dict__['__ZGA']. I can't have a global lock inside my external method as I get a different environment with each call (which is why I need the singleton in the first place).
It would be sufficient for my purposes if I could guarantee to get certain code run just once at startup time.
Is this actually necessary? Is it cirtical that only one ZGA_calculator gets created? If not, you don't really have a thread-safety problem here. If it is, then you could protect the section above with a lock: import thread zgalock=tread.allocate_lock() def __ZGA(): zgaloc.acquire() try: if not hasattr(sys.modules['__main__'],'__ZGA'): #unsafe here... Z=ZGA_calculator() # initialise things to do with Z sys.modules['__main__'].__dict__['__ZGA']=Z return sys.modules['__main__'].__dict__['__ZGA'] finally: zgaloc.release()
Do I have to make a product or is there some easier way to do this.
I think that a product would be easier. With a product, you could simply put the above code in the product __init__ module. BTW, why do you want to hack __main__? Jim -- Jim Fulton mailto:jim@digicool.com Python Powered! Technical Director (888) 344-4332 http://www.python.org Digital Creations http://www.digicool.com http://www.zope.org Under US Code Title 47, Sec.227(b)(1)(C), Sec.227(a)(2)(B) This email address may not be added to any commercial mail list with out my permission. Violation of my privacy with advertising or SPAM will result in a suit for a MINIMUM of $500 damages/incident, $1500 for repeats.