Я неправильно использую многопроцессорную библиотеку Python?
Некорректно? Нет. Неэффективно? Да.
Помните, что многопроцессорная обработка создает совместимые, но в остальном независимые экземпляры Python. Думайте о них как о работниках на фабрике или о друзьях, работающих на большой работе.
Если над проектом работает только один человек, который может свободно передвигаться по заводскому цеху, подбирать инструмент, использовать его, опускать, перемещать куда-то еще, поднимать следующий инструмент и так далее. Добавьте второго человека - или, что еще хуже, больше людей, возможно, даже сотни людей, - и этот человек должен теперь координировать: если какая-то область является общей, или какой-то инструмент используется, Боб не может просто взять что-то, он должен попросить Алису сначала, если она с этим покончила.
Объект Manager
- это общая оболочка многопроцессорной обработки Python для совместного использования. Помещение переменных в диспетчер Namespace
означает , что они являются общими, поэтому автоматически проверяйте их перед использованием . (Точнее, они хранятся в одном месте - в одном процессе - и доступны или изменяются из других через прокси.)
Здесь вы сделали метафорический эквивалент замены «Боб: считать так быстро, как вы можете» на «Боб: постоянно прерывать Алису, чтобы спросить, считает ли она, затем считать; Алиса: считать, но Боб постоянно прерывал ее. " Боб и Алиса теперь проводят большую часть своего времени, разговаривая друг с другом, а не считая.
Как документация гласит :
... при параллельном программировании обычно лучше избегать использования общего состояния, насколько это возможно. Это особенно верно при использовании нескольких процессов.
(начинается с фразы «как упомянуто выше», но выше не упоминается!).
Существует множество стандартных приемов, таких как пакетная обработка для выполнения большой работы между обменом событиями или использование общей памяти для ускорения совместное использование - но с общей памятью вы вводите необходимость блокировать элементов.