模块内对象上的类之间的多处理

时间:2019-03-15 17:05:37

标签: python multiprocessing

我正在尝试通过使用简单的顶级脚本访问模块中包含的方法来并行化对作为另一个对象的属性的对象的操作。

我在两个模块中有四个类:Host_Population和Host,包含在Host_Within_Population中;和Vector_Population和Vector,包含在Vector_Within_Population中。 Host_Population.hosts是Host对象的列表,Vector_Population.vectors是Vector对象的列表。

顶级脚本如下所示:

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对象的属性将通过host_cycle()中作用于它们的方法而永久更改,同样,对于vector_cycle()中的每个Vector对象,其属性也将永久更改。在每个周期内处理对象的顺序无关紧要(即主机不受其他主机执行的操作的影响),但是host_cycle()必须在vector_cycle()开始之前完全完成。 vector_cycle中的进程需要能够访问Host_Population中的每个主机,并且这些进程的结果将取决于主机的属性。除了host_cycle()和vector_cycle()之外,我将需要同时访问这两个模块中的方法。我一直试图在许多不同的排列中使用multiprocessing.pool和map,但是即使以高度简化的形式也没有运气。我尝试过的一个例子:

class Host_Population:

    def host_cycle(self):
        with Pool() as q:
            q.map(h.lifecycle, [h for h in self.hosts])

但是,当然,h没有定义。

我无法使回答适应类似的问题,例如this one。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

因此,对于这个难以置信的不受欢迎的问题,我得到了风滚草徽章,但是以防万一有人遇到相同的问题,我找到了解决方案。

在Host类中,lifecycle()返回一个Host:

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)