Я пытаюсь запустить пул процессов из метода объекта и переключился на pathos
после прочтения того, что dill
может сериализовать классы, в которых pickle
терпит неудачу. Однако у меня все еще есть проблемы с зависанием python при использовании пулов в объектах, созданных из импортированных классов. Например, следующий код работает при запуске в качестве отдельного файла.
Как примечание, код здесь является упрощенной версией того, что я в конечном счете пытаюсь сделать - иметь класс, который принимает дескриптор функции, помогает пользователю создавать различные входные данные для этой функции, а затем нажимать от нескольких параллельных вызовов для различных входов.
# filename test.py
from pathos.pools import ProcessPool as Pool
def square(n):
a = n*n
return a
class MyClass():
def __init__(self, fcn, fcn_input):
self.fcn = fcn
self.fcn_input = fcn_input
def run(self):
p = Pool(4)
results = p.map(self.fcn, self.fcn_input)
print('Answer: '+str(results))
if __name__ == "__main__":
a = MyClass(square, list(range(10)))
a.run()
>>> runfile('test.py')
Answer: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Это работает как ожидалось. Однако, если я пытаюсь сделать это через импорт из другого файла, ядро python зависает, и мне приходится вручную перезагружать его. Любая идея, что я делаю здесь не так?
# filename test2.py
from test import MyClass, square
a = MyClass(square, list(range(10)))
a.run()
>>> runfile('test2.py')
.... [kernel freezes]
Одна подсказка: если я запускаю test.py
и , то test2.py
в том же ядре, оба работают нормально. Зависание происходит только при первом запуске test2.py
.