Я предполагаю, что это потому, что объекты могут быть скопированы и не доступны только при многопроцессорной обработке.
Это совершенно верно, и это половина ответа.Поскольку процессы изолированы, каждый из них имеет свою собственную копию object_list
.Одним из решений здесь является использование ThreadPoolExecutor
(все потоки имеют одинаковый object_list
).
Синтаксис для его использования немного отличается от того, что вы пытаетесь использовать, но это работает как задумано:
executor = ThreadPoolExecutor(max_workers=3)
res = executor.map(Object.aplus, object_list)
Если вы действительно хотите использовать ProcessPoolExecutor
, вам нужно каким-то образом получить данные от процессов.Самый простой способ - использовать функции, которые возвращают значения:
from concurrent.futures import ProcessPoolExecutor
class Object:
def __init__(self, a):
self.a = a
def aplus(self):
self.a += 1
return self.a
if __name__ == '__main__':
object_list = [Object(1), Object(2), Object(3)]
executor = ProcessPoolExecutor(max_workers=3)
for result in executor.map(Object.aplus, object_list):
print("I got: " + str(result))
Вы даже можете иметь функцию, которую вы map
возвращаете self
, и затем помещать эти возвращенные объекты обратно в object_list
конец.Таким образом, полное многопроцессорное решение будет выглядеть так:
from concurrent.futures import ProcessPoolExecutor
class Object:
def __init__(self, a):
self.a = a
def aplus(self):
self.a += 1
return self
if __name__ == '__main__':
object_list = [Object(1), Object(2), Object(3)]
executor = ProcessPoolExecutor(max_workers=3)
object_list = list(executor.map(Object.aplus, object_list))