我试图通过使用一个简单的顶级脚本来访问模块中包含的方法来并行化对象上的操作,这是另一个对象的属性。
我在两个模块中有四个类:host_population和host,其中包含在host_within_population中;vector_within_population中包含的vector_population and vector。host_population.hosts是主机对象的列表,vector_population.vectors是向量对象的列表。
顶级脚本看起来像这样:
import Host_Within_Population
import Vector_Within_Population
host_pop = Host_Within_Population.Host_Population()
vect_pop = Vector_Within_Population.Vector_Population()
for time in range(5):
host_pop.host_cycle(time)
vect_pop.vector_cycle(time)
host_pop.calculate_variance()
这是模块的表示,host_within_population
class Host_Population(object):
def host_cycle(self, time):
for host in self.hosts:
host.lifecycle(time)
host.mort()
class Host(object):
def lifecycle(self, time):
#do stuff
def mort(self):
#do stuff
这是模块的表示,vector_within_population
class Vector_Population(object):
def vector_cycle(self, time):
for vect in self.vects:
vect.lifecycle(time)
vect.mort()
class Vector(object):
def lifecycle(self, time):
#do stuff
def mort(self):
#do stuff
我希望从host_cycle()和vector_cycle()中的for循环(从顶级脚本调用方法)。每个主机对象的属性将通过在host_cycle()中对它们的方法,以及对vector_cycle()中的每个向量对象的方法永久更改。在每个周期内处理的对象的顺序都没关系(IE主机不受其他主机采取的操作的影响),但是host_cycle()必须在vector_cycle()开始之前完全完成。vector_cycle中的过程需要能够访问host_population中的每个主机,这些过程的结果将取决于主机的属性。除了host_cycle()和vector_cycle()以外,我需要在两个模块中访问两个模块的方法。我一直在尝试在许多不同的排列中使用多处理和映射,但是即使以高度简化的形式也没有运气。我尝试过的东西的一个例子:
class Host_Population:
def host_cycle(self):
with Pool() as q:
q.map(h.lifecycle, [h for h in self.hosts])
,但是当然,H。
我一直无法将回答调整到类似问题的问题上。任何帮助都将不胜感激。
,所以我为这个不受欢迎的问题获得了一个滑倒徽章,但是以防万一有人遇到相同的问题,我找到了一个解决方案。
在主机类中,LifeCycle()返回主机:
def lifecycle(self, time):
#do stuff
return self
这些传递给host_within_population类中的多处理方法,将它们添加到人群中。
def host_pop_cycle(self, time):
p = Pool()
results = p.map_async(partial(Host.lifecycle, time = time), self.hosts)
p.close()
p.join()
self.hosts = []
for a in results.get():
self.hosts.append(a)