Как выполнить многопроцессорную обработку для одной функции в Python?

Я читаю тему Multiprocessing для Python 3 и пытаюсь включить метод в свой скрипт, однако я получаю следующую ошибку:

AttributeError: __ exit __

Я использую Windows 7 с 8-ядерным процессором i-7, у меня есть большой шейп-файл, который я хочу обработать (с программным обеспечением для сопоставления, QGIS), используя предпочтительно все 8 ядер. Ниже приведен код, который я имею, я был бы очень признателен за любую помощь в этом вопросе:

from multiprocessing import Process, Pool def f(): general.runalg("qgis:dissolve", Input, False, 'LAYER_ID', Output) if __name__ == '__main__': with Pool(processes=8) as pool: result = pool.apply_async(f) 

Функция контекстного менеджера multiprocessing.Pool был добавлен только в Python 3.3:

Новое в версии 3.3: Объекты пула теперь поддерживают протокол управления контекстом – см. Типы Контекстного Менеджера. __enter__() возвращает объект пула, а __exit__() вызывает terminate() .

Тот факт, что __exit__ не определен, предполагает, что вы используете 3.2 или ранее. Чтобы получить эквивалентное поведение, вам необходимо вручную вызвать terminate в Pool :

 if __name__ == '__main__': pool = Pool(processes=8) try: result = pool.apply_async(f) finally: pool.terminate() 

Тем не менее, вы, вероятно, не хотите использовать terminate (или оператор with , по расширению) здесь. Метод __exit__ вызовов Pool terminate , что приведет к принудительному выходу из ваших работников, даже если они не будут выполнены с их работой. Вероятно, вы действительно хотите дождаться завершения работника до того, как вы выйдете, а это значит, что вместо этого вы должны вызвать функцию close() , а затем использовать join чтобы дождаться завершения всех рабочих до выхода:

 if __name__ == '__main__': pool = Pool(processes=8) result = pool.apply_async(f) pool.close() pool.join()