Я 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
Итак, что происходит выше, так это то, что вызывается метод boo
экземпляра Bar
b
, где b.boo
передается новому процессу Python, а затем оценивается для каждого из вложенных списков. Как видите, результаты верны… len("12")+len("3")+len("456") равно 6 и так далее.
Однако вы также можете видеть, что когда вы смотрите на b.sum
, это загадочным образом все еще 0
. Почему b.sum
по-прежнему равно нулю? Ну, что делает multiprocessing
(и, следовательно, также pathos.multiprocessing
), так это делает КОПИЯ всего, что вы передаете через карту в другой процесс python… а затем вызывается скопированный экземпляр (параллельно) и возвращается любые результаты вызываются вызываемым методом. Обратите внимание, что вы должны ВОЗВРАТИТЬ результаты, либо распечатать их, либо зарегистрировать, либо отправить в файл, либо иным образом. Они не могут вернуться к исходному экземпляру, как вы могли бы ожидать, потому что это не исходный экземпляр, отправленный другим процессорам. Копии экземпляра создаются, а затем удаляются — у каждой из них был увеличен атрибут sum
, но исходный `b.sum' не тронут.
Тем не менее, в pathos
есть планы сделать что-то подобное вышеописанному, чтобы оно работало так, как вы могли бы ожидать, когда исходный объект IS обновляется, но он пока не работает так.
РЕДАКТИРОВАТЬ: Если вы устанавливаете с pip
, обратите внимание, что последней выпущенной версии pathos
несколько лет, и она может быть установлена неправильно или могут быть установлены не все подмодули. Новый выпуск pathos
ожидается, но до тех пор лучше получить последнюю версию кода с github и установить оттуда. Ствол по большей части стабильно находится в стадии разработки. Я думаю, что ваша проблема могла заключаться в том, что не все пакеты были установлены из-за «новой» pip
-- «старой» pathos
несовместимости при установке. Если pathos.multiprocessing
отсутствует, это наиболее вероятный виновник.
Получите pathos
с github здесь: https://github.com/uqfoundation/pathos
person
Mike McKerns
schedule
28.10.2014