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
?