Я пытаюсь использовать mulitprocessing.Pool
для ускорения выполнения функции в диапазоне входных данных. Кажется, процессы были вызваны, поскольку мой диспетчер задач указывает на значительное увеличение использования моего ЦП, но задача никогда не завершается. Никаких исключений никогда не возникает, во время выполнения или иным образом.
from multiprocessing import Pool
def f(x):
print(x)
return x**2
class Klass:
def __init__(self):
pass
def foo(self):
X = list(range(1, 1000))
with Pool(15) as p:
result = p.map(f, X)
if __name__ == "__main__":
obj = Klass()
obj.foo()
print("All Done!")
Интересно, что, несмотря на рост загрузки ЦП, print(x)
никогда ничего не выводит на консоль.
Я переместил функцию f
за пределы класса, как было предложено здесь, чтобы бесполезно. Я также пытался добавить p.close()
и p.join()
, но безуспешно. Использование других методов класса Pool
, таких как imap
, приводит к TypeError: can't pickle _thread.lock objects
ошибкам и, кажется, делает шаг в сторону от примера использования во введении Документация по многопроцессорной обработке Python.
Добавляя путаницы, если я попытаюсь запустить приведенный выше код достаточное количество раз (убивая зависшее ядро после каждой попытки), код начнет стабильно работать, как и ожидалось. Обычно требуется около двадцати попыток, прежде чем это «щелкнет» на месте. Перезапуск моей IDE возвращает теперь функциональный код обратно в прежнее неисправное состояние. Для справки: я использую дистрибутив Anaconda Python (Python 3.7) со Spyder IDE в Windows 10. Мой ЦП имеет 16 ядер, поэтому Pool(15)
не требует больше процессов, чем ядер ЦП. Однако запуск кода в другой среде IDE, такой как Jupyter Lab, приводит к тем же неверным результатам.
Другие предположили, что это может быть недостатком самого Spyder, но предложение использовать mulitprocessing.Pool
вместо mulitprocessing.Process
тоже не работает.
__init__
излишне, поскольку оно будет унаследовано отobject
. - person Daniel Walker   schedule 07.05.2020f
? Например,print(x)
. Таким образом, вы могли видеть процессы, которые запускаются. - person Daniel Walker   schedule 07.05.2020print(x)
кf
ничего не выводит на консоль. - person NolantheNerd   schedule 07.05.2020