запустить тот же метод списка экземпляров в pathos.multiprocessing - PullRequest
0 голосов
/ 25 мая 2019

Я работаю над проблемой коммивояжера. Учитывая, что все агенты пересекают один и тот же граф, чтобы найти свой собственный путь отдельно, я пытаюсь распараллелить действия агентов по поиску пути. задача для каждой итерации, все агенты начинают с начального узла, чтобы найти свои пути, и собирают все пути, чтобы найти лучший путь в текущей итерации.

Я использую pathos.multiprocessing.

класс агента имеет метод traverse, как,

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))

но процессы создаются последовательно и работают очень медленно. Я хотел бы получить некоторые инструкции о том, как правильно / достойно использовать пафос в этой ситуации.

спасибо!

UPDATE:

Я использую пафос 0.2.3 в Ubuntu,

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'```

1 Ответ

1 голос
/ 25 мая 2019

Я 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()
>>> 
...