Python multiprocessing.pool: разница между map_async и imap с примерами кода

В модуле Python multiprocessing.poolсуществует два метода параллельного выполнения функций: map_asyncи imap. Вот разница между ними:

  1. map_async: этот метод применяет функцию к каждому элементу в итерации и немедленно возвращает объект AsyncResult. Он не блокирует основной процесс и позволяет выполнять другие задачи во время обработки вызовов функций. Вы можете использовать метод get()объекта AsyncResultдля получения результатов.

Вот пример использования map_async:

from multiprocessing import Pool
def square(x):
    return x  2
if __name__ == '__main__':
    with Pool() as pool:
        result = pool.map_async(square, range(10))
        pool.close()
        pool.join()
        print(result.get())

В этом примере square — это функция, вычисляющая квадрат числа. Метод pool.map_asyncприменяет функцию squareк каждому числу в диапазоне от 0 до 9. Объект AsyncResultresultполучен, и для получения результатов вызывается метод get().

  1. imap: этот метод похож на map_async, но возвращает итератор, который возвращает результаты по мере их появления. Это позволяет обрабатывать результаты в режиме реального времени по мере их генерации, а не ждать, пока все результаты будут готовы.

Вот пример использования imap:

from multiprocessing import Pool
def square(x):
    return x  2
if __name__ == '__main__':
    with Pool() as pool:
        result = pool.imap(square, range(10))
        for res in result:
            print(res)

В этом примере вместо использования map_asyncмы используем imapдля получения итератора result. Затем мы можем перебрать result, чтобы получить результаты по мере их появления и распечатать их.