[Tutor] thread-safe singleton ?
Raymond Hettinger
python@rcn.com
Fri, 31 May 2002 18:53:29 -0400
My first thought is to just use a lock.
Raymond Hettinger
----- Original Message -----
From: "Praveen Kumar" <pk1u@yahoo.com>
To: <tutor@python.org>
Sent: Friday, May 31, 2002 6:35 PM
Subject: [Tutor] thread-safe singleton ?
>
> Are either/both of the below singleton implementations
> thread-safe ? I'm thinking not, b/c I think there are
> cases where multiple threads can execute the statement
> that sets the singleton instance, eg:
>
>
> Singleton.__instance = Singleton.__impl()
>
> Singleton.__single = self
>
> I'm new to python, so perhaps I'm missing something.
> Thanks,
>
> pk
>
> -----
>
> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52558
>
> class Singleton:
> """ A python singleton """
>
> class __impl:
> """ Implementation of the singleton interface
> """
>
> def spam(self):
> """ Test method, return singleton id """
> return id(self)
>
> # storage for the instance reference
> __instance = None
>
> def __init__(self):
> """ Create singleton instance """
> # Check whether we already have an instance
> if Singleton.__instance is None:
> # Create and remember instance
> Singleton.__instance = Singleton.__impl()
>
> # Store instance reference as the only member
> in the handle
> self.__dict__['_Singleton__instance'] =
> Singleton.__instance
>
> def __getattr__(self, attr):
> """ Delegate access to implementation """
> return getattr(self.__instance, attr)
>
> def __setattr__(self, attr, value):
> """ Delegate access to implementation """
> return setattr(self.__instance, attr, value)
>
>
> # Test it
> s1 = Singleton()
> print id(s1), s1.spam()
>
> s2 = Singleton()
> print id(s2), s2.spam()
>
> # Sample output, the second (inner) id is constant:
> # 8172684 8176268
> # 8168588 8176268
>
>
> -----------------------------
>
> http://www.python.org/workshops/1997-10/proceedings/savikko.html
>
> class Singleton:
> __single = None
> def __init__( self ):
> if Singleton.__single:
> raise Singleton.__single
> Singleton.__single = self
>
> def Handle( x = Singleton ):
> try:
> single = x()
> except Singleton, s:
> single = s
> return single
>
>
> __________________________________________________
> Do You Yahoo!?
> Yahoo! - Official partner of 2002 FIFA World Cup
> http://fifaworldcup.yahoo.com
>
>
> _______________________________________________
> Tutor maillist - Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor