Как выполнить многопроцессорную обработку для одной функции в 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)
1 ответ:
Функция контекстного менеджера
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()