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

本文介绍了一种利用Python的multiprocessing模块中的Manager类来实现跨进程共享类的方法,通过自定义MyRedisLockMgr类和MyManager管理者类,实现进程间的通信与资源共享,同时运用单例模式确保资源的一致性和唯一性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

共享类

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值