[python]模块-multiprocessing-多进程模块(2)

共享类

# 定义要共享的类
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()

猜你喜欢

转载自blog.csdn.net/sszzyzzy/article/details/89680917