Создан экземпляр класса многопроцессных изменений Python
У меня есть список экземпляров классов, и я хочу параллельно вызывать один и тот же метод экземпляра, использовать pathos для возможности выбора метода экземпляра. Истинная проблема заключается в том, что когда я хочу изменить / добавить атрибут к экземплярам, он не ' я думаю, это потому, что травление подпроцесса - это точная копия входных данных. У кого-нибудь есть идеи, как это решить? Я не хочу менять способ написания метода экземпляра (например, вернуть значение и собрать его позже).
from joblib import Parallel, delayed
import pathos.multiprocessing as mp
# import multiprocessing as mp
import random
import os
pool = mp.Pool(mp.cpu_count())
class Person(object):
def __init__(self, name):
self.name = name
def print_name(self, num):
self.num = num
print "worker {}, person name {}, received int {}".format(os.getpid(), self.name, self.num)
people = [Person('a'),
Person('b'),
Person('c'),
Person('d'),
Person('e'),
Person('f'),
Person('g'),
Person('h')]
for i, per in enumerate(people):
pool.apply_async(Person.print_name, (per, i) )
pool.close()
pool.join()
print 'their number'
for per in people:
print per.num
Это вывод, атрибут num не найден, я думаю, это потому, что в этих копиях сделано изменение.
In [1]: run delme.py
worker 13981, person name a, random int 0
worker 13982, person name b, random int 1
worker 13983, person name c, random int 2
worker 13984, person name d, random int 3
worker 13985, person name e, random int 4
worker 13986, person name f, random int 5
worker 13987, person name g, random int 6
worker 13988, person name h, random int 7
their number
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/chimerahomes/wenhoujx/brain_project/network_analysis/delme.py in <module>()
39 print 'their number'
40 for per in people:
---> 41 print per.num
AttributeError: 'Person' object has no attribute 'num'
Следуя предложению в комментариях, я пытаюсь вернуть self из дочернего процесса, но кажется пафосной ошибкой, что возвращаемое self НЕ является его первоначальным типом. Смотрите следующий код:
import pickle
# from joblib import Parallel, delayed
import pathos.multiprocessing as mp
# import multiprocessing as mp
import random
import os
pool = mp.Pool(mp.cpu_count())
class Person(object):
def __init__(self, name):
self.name = name
def print_name(self, num):
self.num = num
print "worker {}, person name {}, received int {}".format(os.getpid(), self.name, self.num)
# return itself and put everything together
return self
people = [Person('a'),
Person('b'),
Person('c'),
Person('d'),
Person('e'),
Person('f'),
Person('g'),
Person('h')]
# Parallel(n_jobs=-1)(delayed(Person.print_name)(per) for per in people)
res = []
for i, per in enumerate(people):
res.append(pool.apply_async(Person.print_name, (per, i) ))
pool.close()
pool.join()
people = [rr.get() for rr in res]
print 'their number'
for per in people:
print per.num
print isinstance(people[0], Person)
и это вывод:
In [1]: run delme.py
worker 29963, person name a, received int 0
worker 29962, person name b, received int 1
worker 29964, person name c, received int 2
worker 29962, person name d, received int 3
worker 29966, person name e, received int 4
worker 29967, person name f, received int 5
worker 29966, person name g, received int 6
worker 29967, person name h, received int 7
their number
0
1
2
3
4
5
6
7
False
Я использую многопроцессорный пакет по умолчанию, и у него нет такой проблемы.
1 ответ
Проблема в том, что self.num
является назначенным в дочернем процессе. многопроцессорная обработка не передает исходный объект вызывающей стороне. Он передает код возврата метода обратно. Итак, вы могли бы пройти num
вернуться прямо или даже self
(но это, как правило, неэффективно и не заменяет существующий объект в родительском объекте, просто создает новый).