Я пытаюсь использовать ProcessPoolExecutor, но получаю сообщение об ошибке «Объекты очереди должны быть разделены между процессами только через наследование», но я не использую очередь (по крайней мере, явно). Я не могу найти ничего, что объясняет, что я делаю неправильно.
Вот некоторый код, демонстрирующий проблему (не мой фактический код):
from concurrent.futures import ProcessPoolExecutor, as_completed
class WhyDoesntThisWork:
def __init__(self):
self.executor = ProcessPoolExecutor(4)
def execute_something(self, starting_letter):
futures = [self.executor.submit(self.something, starting_letter, d) for d in range(4)]
letter = None
for future in as_completed(futures):
letter = future.result()
print(letter)
def something(self, letter, d):
# do something pointless for the example
for x in range(d):
letter = chr(ord(letter) + 1)
if __name__ == '__main__':
WhyDoesntThisWork(). execute_something('A')
Эль Русо указал, что если сделать something() статическим или классовым методом, ошибка исчезнет. К сожалению, мой фактический код должен вызывать другие методы, используя self.
concurrent.futures.ProcessPoolExecutor
, сериализуются. Поэтому, когда вы отправляете методself.something
(который является объектом, который хранитself
в своем атрибуте__self__
, см. дескрипторы),self
тоже сериализуется, поэтому он должен быть сериализуемым. Но из-за атрибутаself.executor
это не так, посколькуconcurrent.futures.ProcessPoolExecutor
имеет базовый вызовmultiprocessing.Queue
и результатmultiprocessing.Queue
. - person Maggyero   schedule 09.07.2019