【发布时间】:2021-06-24 23:02:15
【问题描述】:
我需要在一个类中使用多处理技术来调用另一个类的方法。解释如下。
我正在编写多代理策略。因此,我的代码分为 3 个类:
- 代理类
- 环境类
- 主要。
在代理类中,我正在运行一个返回决策变量字典的 MILP 问题:
class Agent:
def __init__():
....
def Optimisation():
.....
return decision_agent
类环境接收所有代理的输出以计算“社区”输出。由于每个代理都是一个独立的实体,代理将并行计算他们的优化问题。因此,我想在环境类中使用多处理来获取所有代理的决策
import Agent as Agent
class Env:
def __init__():
self.agents = #list of agents in my environment
def community_output():
#**start the part of code I want to multiprocess**
for agent in self.agents:
agents_output.append(agent.Optimisation)
#**end the part of code I want to multiprocess**
"""compute community_output based on agents_output """
return community_output
然后在main中,调用方法community_output():
import Env as Env
if __name__ == '__main__':
env = Env()
result = env.community_output()
请问我该怎么做?
由于我有一个实例方法列表作为可迭代对象,因此我尝试了以下方法:
def job(instance):
instance.Optimisation()
return instance
if __name__ == '__main__':
pool = mp.Pool(processes=4)
agents_output= pool.map(job, agents)
pool.close()
pool.join()
这仅在我删除 Env 类并将其所有处理放在 def job(instance) 之前才有效。
当我将它集成到Env 类中时:
import Agent as Agent
class Env:
def __init__():
self.agents = #list of agents in my environment
def job(instance):
instance.Optimisation()
return instance
def community_output():
pool = mp.Pool(processes=4)
agents_output = pool.map(self.job, self.agents)
pool.close()
pool.join()
""" Compute community_output based on agents_output """
return community_output
Import Env as Env
if __name__ == '__main__':
env = Env()
result = env.community_output()
我得到了错误:
File "C:\Users\chaim\...\Env.py", line 576, in community_output
results = pool.map(self.job, self.agents)
File "C:\Users\chaim\anaconda3\envs\picos\lib\multiprocessing\pool.py", line 268, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "C:\Users\chaim\anaconda3\envs\picos\lib\multiprocessing\pool.py", line 657, in get
raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '[{'opt_prob': <Mixed-Integer Linear Program>, 'q_us_val': <190x1 matrix, tc='d'>, 'q_ds_val': 0.0, 'p_net_exp_val': <48x1 matrix, tc='d'>, 'q_sup_sell_val': <48x1 matrix, tc='d'>, 'q_sup_buy_val': <48x1 matrix, tc='d'>, 'p_es_ch_val': <48x1 matrix, tc='d'>, 'p_es_dis_val': <48x1 matrix, tc='d'>, 'q_ds_0': <1×1 Real Constant: 0>, 'q_us_0': <1×1 Real Constant: q_usᵀ·[190×1]>}]'. Reason: 'PicklingError("Can't pickle <function <lambda> at 0x000001B8B9C31288>: attribute lookup <lambda> on picos.modeling.options failed")'
我注意到:
{'opt_prob': <Mixed-Integer Linear Program>, '... q_usᵀ·[190×1]>}
是agent.Optimisation方法返回的字典,picos是使用的优化API。
有什么办法可以解决这个问题吗?
【问题讨论】:
-
类方法都会自动接收一个初始参数——通常命名为
self——这是它们所属的类的实例。您的几乎所有代码中都没有。请提供一个可运行的minimal reproducible example,其他人可以使用它来测试他们的答案。 -
是的,我的所有类方法中都包含“自我”。我将尝试详细说明一个最小的可重现示例以避免混淆。
标签: python python-multiprocessing picos-api