通常的python的singleton写法是进程内唯一,即进程内的所有线程共享一个单例。例如
def singleton(cls):
""" decorator for singleton """
instances = {}
def _singleton(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return _singleton
但项目中我们往往需要更细颗粒度的Singleton,比如一个进程中有多个worker线程,但每个线程都希望有自己的线程内单独Singleton对象,其他线程也独立操作自己的线程内Singleton,所谓的线程级Singleton,其实他的实例总数 = 1(每个线程内部唯一的一个) * N (线程数)= N。
import thread
def thread_singleton(cls):
""" thread specific singleton """
instances = {}
def _singleton(*args, **kw):
t_ident = thread.get_ident()
if cls not in instances:
instances[cls] = {}
instances[cls][t_ident] = cls(*args, **kw)
elif t_ident not in instances[cls]:
instances[cls][t_ident] = cls(*args, **kw)
return instances[cls][t_ident]
return _singleton