我正在研究旅行推销员的问题。鉴于所有代理都遍历同一图以分别找到自己的路径,因此我尝试并行化代理的寻路动作。任务是每次迭代,所有代理都从起始节点开始以查找其路径,并收集所有路径以找到当前迭代中的最佳路径。
我正在使用pathos.multiprocessing。
agent类具有遍历方法,
class Agent:
def find_a_path(self, graph):
# here is the logic to find a path by traversing the graph
return found_path
我创建了一个辅助函数来包装该方法
def do_agent_find_a_path(agent, graph):
return agent.find_a_path(graph)
然后通过传递辅助函数,代理实例列表和相同的图来创建池并使用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'```
答案 0 :(得分:1)
我是pathos
的作者。我不确定您的方法需要多长时间才能运行,但是根据您的评论,我将假设时间不会很长。我建议,如果该方法是“快速”的,则应改用ThreadPool
。另外,如果不需要保留结果的顺序,最快的映射通常是uimap
(无序的迭代映射)。
>>> class Agent:
... def basepath(self, dirname):
... import os
... return os.path.basename(dirname)
... def slowpath(self, dirname):
... import time
... time.sleep(.2)
... return self.basepath(dirname)
...
>>> a = Agent()
>>> import pathos.pools as pp
>>> dirs = ['/tmp/foo', '/var/path/bar', '/root/bin/bash', '/tmp/foo/bar']
>>> import time
>>> p = pp.ProcessPool()
>>> go = time.time(); tuple(p.uimap(a.basepath, dirs)); print(time.time()-go)
('foo', 'bar', 'bash', 'bar')
0.006751060485839844
>>> p.close(); p.join(); p.clear()
>>> t = pp.ThreadPool(4)
>>> go = time.time(); tuple(t.uimap(a.basepath, dirs)); print(time.time()-go)
('foo', 'bar', 'bash', 'bar')
0.0005156993865966797
>>> t.close(); t.join(); t.clear()
并且,只是为了与需要更长的时间进行比较...
>>> 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()
>>>