Еще одна статья-шпаргалка о модуле multiprocessing в Python, без воды, от новичка для новичков многопроцессорного программирования.
pool.map и pool.map_async являются методами модуля multiprocessing.Pool в Python, которые позволяют параллельно выполнять функции на нескольких процессах.
pool.map: Этот метод блокирует выполнение программы до тех пор, пока все задачи не будут завершены. Он принимает функцию и список аргументов, применяет функцию к каждому аргументу в списке и возвращает результаты в том же порядке, в котором они были переданы в список. Этот метод подходит для случаев, когда нужно дождаться завершения всех задач перед продолжением выполнения программы.
pool.map_async: Этот метод также принимает функцию и список аргументов, но не блокирует выполнение программы. Вместо этого он возвращает объект multiprocessing.pool.AsyncResult, который позволяет асинхронно отслеживать статус выполнения каждой задачи и получать результаты по мере их завершения. Этот метод удобен, когда нужно продолжить выполнение программы без ожидания завершения всех задач.
Таким образом, основное различие между pool.map и pool.map_async заключается в том, что первый блокирует выполнение программы, а второй позволяет продолжить выполнение программы без ожидания завершения всех задач.
Вот примеры использования pool.map и pool.map_async в Python:
Пример использования pool.map
import multiprocessing
def square(x):
return x * x
if __name__ == "__main__":
pool = multiprocessing.Pool()
numbers = [1, 2, 3, 4, 5]
results = pool.map(square, numbers)
print(results)
В этом примере мы создаем пул процессов pool, определяем функцию square, которая возвращает квадрат числа, и список чисел numbers. Метод pool.map(square, numbers) применяет функцию square к каждому элементу списка numbers параллельно на нескольких процессах и возвращает результаты в том же порядке.
Пример использования pool.map_async
import multiprocessing
def cube(x):
return x * x * x
if __name__ == "__main__":
pool = multiprocessing.Pool()
numbers = [1, 2, 3, 4, 5]
async_result = pool.map_async(cube, numbers)
# Продолжаем выполнение программы без ожидания завершения задач
async_result.wait() # Ожидаем завершения всех задач
results = async_result.get()
print(results)
В этом примере мы также создаем пул процессов pool, определяем функцию cube, список чисел numbers, и используем метод pool.map_async(cube, numbers), чтобы асинхронно применить функцию cube к каждому элементу списка. Мы продолжаем выполнение программы без ожидания завершения задач, а затем вызываем async_result.wait() для ожидания завершения всех задач и получаем результаты с помощью async_result.get().
Оба этих метода позволяют использовать параллельные вычисления для ускорения выполнения задач.
Подробнее, но так же лаконично, о модуле multiprocessing можете прочитать в этой статье.