Python 如何在类内使用多重处理,必须属性是object和dict?

Python 如何在类内使用多重处理,必须属性是object和dict?,python,python-3.x,class,multiprocessing,Python,Python 3.x,Class,Multiprocessing,我有一门课: # myclass.py class MyClass(object): def __init__(self,*args): self.env = args[0] self.mydict = args[1] def run(self): list_data = [1,2,3,4,5,6,7,8,9,10] pool = mp.Pool(3) for _ in tqdm(pool.ima

我有一门课:

# myclass.py
class MyClass(object):
    def __init__(self,*args):
        self.env = args[0] 
        self.mydict = args[1]

    def run(self):
        list_data = [1,2,3,4,5,6,7,8,9,10]
        pool = mp.Pool(3)
        for _ in tqdm(pool.imap_unordered(self.exefunction, list_data), total = len(a), desc = 'Main process'):
            pass
        pool.close()
        pool.join

    def exefunction(self,number):
        print(number)
        print(self.env)
        print(self.mydict)

# myenv.py
class MyEnv(object):
    def __init__(self, *args, **kwargs):
        self.database = args[0]
        self.host = args[1]
        self.port = args[2]
        self.user = args[3]
        self.pwd = args[4]
        self.sp = None
        self.param = None
        self.output_exception_msg = None
        self.output_sperror_msg = None
        self.pool = self.create_pool()

    def create_pool(self):
    self.pool = MySQLConnectionPool(pool_name=config.pool_name, pool_size=config.pool_size,
                               user=self.user, password=self.pwd, host=self.host, port=self.port, database=self.database)
    return self.pool

# main.py
if __name__ == '__main__':
    list_dict = [{ 1 : 3 , 5 : 10 }]
    env = MyEnv(**dbconfig)
    build_class = MyClass(env, list_dict)
    build_class.run()
self.env
是从另一个类创建的对象

当我调用函数
run
时,我遇到一个类型错误:
无法序列化套接字对象

我知道问题是
MyClass
有一个object和dict(我尝试传递
self.env
self.mydict
是整数,它正在工作)。我没有任何解决办法


更新:我在数据库中打开了一个连接池(
self.env
包含该连接池)

每个进程在自己的地址空间中运行,因此需要自己的数据库连接池。因此:

  • MyEnv
    不应从其
    \uuuuu init\uuuu
    方法显式调用方法
    create\u pool
    ;此池的创建需要推迟到以后
  • 多处理池中的每个进程都将有自己的类
    MyEnv
    实例作为全局变量,该变量在创建池时初始化<代码>创建_池将作为初始化的一部分在每个实例上调用
  • 我显然无法对此进行测试,但如果需要进行最小调整,您应该了解大致情况:

    def init_池(_环境):
    全球环境
    env=_env
    env.create_pool()#现在创建池
    类MyClass(对象):
    定义初始化(self,*args):
    self.env=args[0]
    self.mydict=args[1]
    def运行(自):
    列表数据=[1,2,3,4,5,6,7,8,9,10]
    #为流程池中的每个流程初始化env全局变量:
    pool=mp.pool(3,初始值设定项=init_pool,initargs=(self.env,)
    对于TQM(pool.imap_无序(self.exefunction,list_data)中的u,total=len(a),desc=Main process):
    通过
    pool.close()
    pool.join
    def EXE功能(自身、编号):
    打印(数字)
    打印(环境)#访问全球
    打印(self.mydict)
    #myenv.py
    类MyEnv(对象):
    定义初始化(self,*args,**kwargs):
    self.database=args[0]
    self.host=args[1]
    self.port=args[2]
    self.user=args[3]
    self.pwd=args[4]
    self.sp=无
    self.param=None
    self.output\u exception\u msg=None
    self.output\u sperror\u msg=None
    #现在不创建池:
    self.pool=None
    def创建_池(自):
    self.pool=MySQLConnectionPool(pool\u name=config.pool\u name,pool\u size=config.pool\u size,
    user=self.user,password=self.pwd,host=self.host,port=self.port,database=self.database)
    返回自助池
    #main.py
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    list_dict=[{1:3,5:10}]
    env=MyEnv(**dbconfig)
    构建类=我的类(环境,列表)
    build_class.run()
    
    多处理
    必须将数据保存在文件中,在新进程中运行代码,并从文件中加载数据。但有些对象无法保存在文件中。这就产生了问题。您只能在主进程中使用池,其他进程应使用
    队列
    向主进程发送信息。或者每个进程都应该使用自己的数据库连接。我在Windows系统中运行它,如果我在Linux系统中运行它,可以使用
    fork
    模式来代替
    queue