Python与病毒的多处理

use*_*829 13 python pool multiprocessing pathos

我正在尝试使用Python的pathos将计算指定到单独的进程中,以便使用多核处理器加速它.我的代码组织如下:

class:
   def foo(self,name):
    ...
    setattr(self,name,something)
    ...
   def boo(self):
      for name in list:
         self.foo(name)
Run Code Online (Sandbox Code Playgroud)

由于我在multiprocessing.Pool中遇到酸洗问题,我决定尝试使用pathos.我尝试过,如前几个主题中所述:

import pathos.multiprocessing
Run Code Online (Sandbox Code Playgroud)

但它导致错误:没有模块多处理 - 我在最新的病毒版本中找不到.

然后我尝试修改boo方法:

def boo(self):
 import pathos
 pathos.pp_map.pp_map(self.foo,list)
Run Code Online (Sandbox Code Playgroud)

现在没有抛出错误,但是foo不起作用 - 我的类的实例没有新的属性.请帮助我,因为在花了一天之后,我不知道接下来要去哪里.

Mik*_*rns 28

我是pathos作者.我不确定你要从上面的代码中做什么.不过,我可以说清楚一点.这是一些类似的代码:

>>> from pathos.multiprocessing import ProcessingPool
>>> class Bar:
...   def foo(self, name):
...     return len(str(name))
...   def boo(self, things):
...     for thing in things:
...       self.sum += self.foo(thing)
...     return self.sum
...   sum = 0
... 
>>> b = Bar()
>>> results = ProcessingPool().map(b.boo, [[12,3,456],[8,9,10],['a','b','cde']])
>>> results
[6, 4, 5]
>>> b.sum
0
Run Code Online (Sandbox Code Playgroud)

所以上面发生的是,实例的boo方法被调用,其中传递给新的python进程,然后为每个嵌套列表进行评估.你可以看到结果是正确的...... len("12")+ len("3")+ len("456")是6,依此类推.Barbb.boo

但是,你也可以看到,当你看b.sum,它仍然是神秘的0.为什么b.sum还是零?那么,什么multiprocessing(因此也pathos.multiprocessing)做,是做一个COPY不管你通过映射到其他Python过程......然后复制的实例,然后调用(平行),并返回任何结果被调用的方法叫的.请注意,您必须返回结果,或打印它们,或记录它们,或将它们发送到文件或其他方式.它们无法像您期望的那样返回到原始实例,因为它不是发送到其他处理器的原始实例.创建实例的副本,然后将其处理掉 - 每个实例的sum属性都增加了,但原始的`b.sum'没有被触及.

然而有,计划内pathos做出类似上面的工作正如您所料-在原来的对象IS更新,但它不喜欢的工作呢.

编辑:如果您正在安装pip,请注意最新发布的版本已有pathos几年的历史,可能无法正确安装,或者可能无法安装所有子模块.一个新的pathos版本正在等待,但在那之前,最好从github获取最新版本的代码,并从那里安装.主干大部分在开发中稳定.我认为您的问题可能是由于安装中存在"新" pip- "旧" pathos不兼容性而未安装所有软件包.如果pathos.multiprocessing缺少,这是最可能的罪魁祸首.

pathos从这里获取github:https://github.com/uqfoundation/pathos

  • @Brideau:我正在将`pathos`分裂成更多的包(基本上所有非标准的依赖),以确保一切都是'pip`可安装的.新版本即将推出. (2认同)