Asynchronous 对Paths.multiprocessing中的实例列表运行相同的方法

Asynchronous 对Paths.multiprocessing中的实例列表运行相同的方法,asynchronous,graph,multiprocessing,traveling-salesman,pathos,Asynchronous,Graph,Multiprocessing,Traveling Salesman,Pathos,我正在研究一个旅行推销员的问题。假设所有代理都遍历同一个图以分别找到自己的路径,我将尝试并行化代理的路径查找操作。对于每个迭代,所有代理都从一个开始节点开始查找其路径,并收集所有路径以查找当前迭代中的最佳路径 我正在使用pathos.multiprocessing 代理类具有如下遍历方法: class Agent: def find_a_path(self, graph): # here is the logic to find a path by traversing the

我正在研究一个旅行推销员的问题。假设所有代理都遍历同一个图以分别找到自己的路径,我将尝试并行化代理的路径查找操作。对于每个迭代,所有代理都从一个开始节点开始查找其路径,并收集所有路径以查找当前迭代中的最佳路径

我正在使用pathos.multiprocessing

代理类具有如下遍历方法:

class Agent:
   def find_a_path(self, graph):
     # here is the logic to find a path by traversing the graph
     return found_path
我创建了一个helper函数来包装这个方法

def do_agent_find_a_path(agent, graph):
   return agent.find_a_path(graph)

然后创建一个池并通过传递helper函数、代理实例列表和相同的图形来使用amap

pool = ProcessPool(nodes = 10)
res = pool.amap(do_agent_find_a_path, agents, [graph] * len(agents))
但是,这些进程是按顺序创建的,运行速度非常慢。我想得到一些关于如何在这种情况下正确/体面地利用悲情的指示

谢谢大家!

更新:

我在ubuntu上使用pathos 0.2.3

Name: pathos
Version: 0.2.3
Summary: parallel graph management and execution in heterogeneous computing
Home-page: https://pypi.org/project/pathos
Author: Mike McKerns
我在TreadPool示例代码中遇到以下错误:

>import pathos
>pathos.pools.ThreadPool().iumap(lambda x:x*x, [1,2,3,4])
Traceback (most recent call last):
  File "/opt/anaconda/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2910, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-5-f8f5e7774646>", line 1, in <module>
    pathos.pools.ThreadPool().iumap(lambda x:x*x, [1,2,3,4])
AttributeError: 'ThreadPool' object has no attribute 'iumap'```

>导入病理
>pathos.pools.ThreadPool().iumap(lambda x:x*x[1,2,3,4])
回溯(最近一次呼叫最后一次):
文件“/opt/anaconda/lib/python3.6/site packages/IPython/core/interactiveshell.py”,第2910行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第1行,在
pathos.pools.ThreadPool().iumap(lambda x:x*x[1,2,3,4])
AttributeError:“线程池”对象没有属性“iumap”```

我是《悲情》的作者。我不确定您的方法运行需要多长时间,但根据您的评论,我将假设不会很长。我建议,如果方法是“快速”的,那么您可以使用
线程池。此外,如果不需要保留结果的顺序,最快的映射通常是
uimap
(无序的迭代映射)

而且,与需要更长时间的东西相比

>>> t = pp.ThreadPool(4)
>>> go = time.time(); tuple(t.uimap(a.slowpath, dirs)); print(time.time()-go)
('bar', 'bash', 'bar', 'foo')
0.2055649757385254
>>> t.close(); t.join(); t.clear()
>>> p = pp.ProcessPool()
>>> go = time.time(); tuple(p.uimap(a.slowpath, dirs)); print(time.time()-go)
('foo', 'bar', 'bash', 'bar')
0.2084510326385498
>>> p.close(); p.join(); p.clear()
>>> 

嗨,迈克,谢谢你慷慨的回答!你说得对,这个方法运行得很快。由于结果的顺序很重要,我使用imap。但通过一些实验,我发现是1000节点的NetworkX图形对象延迟了进程的创建,它会在30秒左右阻止下一个进程的创建。如果我减小图形大小,延迟会明显减少。我通过dill转储它,看看它有多大,dill转储文件的大小是31.5MB。所以,现在的问题是如何消除这个巨大的瓶颈。非常感谢你的建议。再次感谢您的积极支持!嗨,Mike,当我使用ThreadPool时,我得到了一个错误:AttributeError:“ThreadPool”对象没有属性“uimap”
,这是由于pathos版本引起的吗?我的是0.2.3。当我将线程池的“uimap”更改为“imap”时,会出现错误
TypeError:“>”在“list”和“int”的实例之间不受支持
可能是导入错误?我使用的是
0.2.4dev0
,但是
0.2.3
应该可以。这应该有效:
paths.pools.ThreadPool().iumap(lambda x:x*x[1,2,3,4])
。如果您仍然看到错误,那么您是否在windows上?如果您在Windows上,您可能需要C/C++编译器来正确构建
多进程
。如果您直接使用
dill
转储,那么有几种变体可能会给您带来较小的pickle。请参见
dill.settings
。不幸的是,这些设置对
pathos
使用
dill
没有影响。嗨,迈克,谢谢你的慷慨回复!我在ubuntu上使用的是0.2.3,但你的线程池示例代码仍然存在错误。我已经更新了问题帖子中的信息和错误。如果你得到上述AttributeError,我认为你有安装问题。基本上,如果
pathos
找不到
多进程
,它将返回到
多进程
。您可以通过以下方式进行检查:(1)尝试导入多进程,以及(2)查看ThreadPool对象的
\uuuuu module\uuuuu
属性。
>>> t = pp.ThreadPool(4)
>>> go = time.time(); tuple(t.uimap(a.slowpath, dirs)); print(time.time()-go)
('bar', 'bash', 'bar', 'foo')
0.2055649757385254
>>> t.close(); t.join(); t.clear()
>>> p = pp.ProcessPool()
>>> go = time.time(); tuple(p.uimap(a.slowpath, dirs)); print(time.time()-go)
('foo', 'bar', 'bash', 'bar')
0.2084510326385498
>>> p.close(); p.join(); p.clear()
>>>