Skip to content

Instantly share code, notes, and snippets.

@wingyiu
Forked from werediver/singleton.py
Created December 12, 2017 16:18
Show Gist options
  • Save wingyiu/88cab312b6dec39933ae7da5e046d345 to your computer and use it in GitHub Desktop.
Save wingyiu/88cab312b6dec39933ae7da5e046d345 to your computer and use it in GitHub Desktop.
A thread safe implementation of singleton pattern in Python. Based on tornado.ioloop.IOLoop.instance() approach.
import threading
# Based on tornado.ioloop.IOLoop.instance() approach.
# See https://github.com/facebook/tornado
class SingletonMixin(object):
__singleton_lock = threading.Lock()
__singleton_instance = None
@classmethod
def instance(cls):
if not cls.__singleton_instance:
with cls.__singleton_lock:
if not cls.__singleton_instance:
cls.__singleton_instance = cls()
return cls.__singleton_instance
if __name__ == '__main__':
class A(SingletonMixin):
pass
class B(SingletonMixin):
pass
a, a2 = A.instance(), A.instance()
b, b2 = B.instance(), B.instance()
assert a is a2
assert b is b2
assert a is not b
print('a: %s\na2: %s' % (a, a2))
print('b: %s\nb2: %s' % (b, b2))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment