共享类
# 定义要共享的类
class MyRedisLockMgr(object):
def __init__(self):
pass
# 定义管理者类, 要继承basemanager
from multiprocessing.managers import BaseManager
class MyManager(BaseManager): # 不需要实现什么
pass
# 获取manager实例的函数
def getManager():
MyManager.register("MyRedisLockMgr", MyRedisLockMgr) # 在管理者处注册要共享的类
m = MyManager() # 获得实例
m.start() # start
return m # 返回实例
def main():
m = getManager() # 调用函数获取管理者实例
LockMgr = m.MyRedisLockMgr() # 在管理者处获取自定义类
ps:单例模式+装饰器
class singleton(object):
def __init__(self, cls):
self._cls = cls
self._instances = None
def __call__(self,*args):
if not self._instances:
self._instances = self._cls(*args)
return self._instances
# A就为单例模式,也可以作为共享类使用
@singleton
class A(object):
pass
完整测试代码:
#!/usr/bin/python27
# -*- coding-utf8 -*-
import time
import sys
sys.path.append("../Singleton")
from Singleton import singleton
@singleton
class MyRedisLockMgr(object):
def __init__(self):
pass
a = MyRedisLockMgr()
print "l",a
import multiprocessing
from multiprocessing.managers import BaseManager
class MyManager(BaseManager):
pass
def getManager():
MyManager.register("MyRedisLockMgr", MyRedisLockMgr)
m = MyManager()
m.start()
return m
def work(pa, mgr):
print "l", pa, mgr
time.sleep(1)
def main():
m1 = getManager()
print "m", m1
m2 = getManager()
print "m", m2
print "l", -1, m1.MyRedisLockMgr()
pool = multiprocessing.Pool(processes=2)
for i in range(3):
LockMgr = m2.MyRedisLockMgr()
pool.apply_async(func=work, args=(i, LockMgr))
pool.close()
pool.join()
if __name__ == "__main__":
main()