【发布时间】:2017-12-18 00:35:27
【问题描述】:
我使用 Metaclass 创建 Singleton 类,它在多线程中运行良好并且只创建 MySingleton 类的一个实例,但在多处理中,它总是创建新实例
import multiprocessing
class SingletonType(type):
# meta class for making a class singleton
def __call__(cls, *args, **kwargs):
try:
return cls.__instance
except AttributeError:
cls.__instance = super(SingletonType, cls).__call__(*args, **kwargs)
return cls.__instance
class MySingleton(object):
# singleton class
__metaclass__ = SingletonType
def __init__(*args,**kwargs):
print "init called"
def task():
# create singleton class instance
a = MySingleton()
# create two process
pro_1 = multiprocessing.Process(target=task)
pro_2 = multiprocessing.Process(target=task)
# start process
pro_1.start()
pro_2.start()
我的输出:
init called
init called
我需要 MySingleton 类 init 方法只被调用一次
【问题讨论】:
-
这里为什么需要元类?
-
我在上面的代码中使用元类制作单例类我创建“SingletonType”元类,MySingleton 是单例类
-
与线程不同的进程不共享上下文(它们在分叉时都会创建它的副本)。如果你想在进程之间交换数据,你应该在这里查看 IPC。
-
本机对象不会在进程之间共享(由于引用计数)。
-
@TomWyllie:不是第一次想要单例的人们提出元类。一些来自另一种语言的人可能写了一个流行的文档来暗示这种模式。我通常不赞成打人,但在这种情况下,我想知道......
标签: python python-2.7 singleton multiprocessing metaclass