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

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()