Параллельное и асинхронное программирование в Python предлагают разнообразные методы эффективной работы с параллелизмом и асинхронностью. Эти подходы позволяют выполнять задачи одновременно или в неблокирующем режиме. Давайте рассмотрим оба подхода, более подробно рассматривая примеры.
Параллельное программирование
Параллельное программирование позволяет выполнять несколько задач одновременно, используя для этого несколько процессов или потоков.
Модуль `multiprocessing`
Модуль `multiprocessing` позволяет создавать и управлять процессами в Python.
import multiprocessing
import os
def worker():
print("Процесс:", os.getpid())
if __name__ == "__main__":
# Создание процесса
process = multiprocessing.Process(target=worker)
# Запуск процесса
process.start()
# Ожидание завершения процесса
process.join()
process.start() - Запускает выполнение процесса. Этот метод вызывает метод run объекта Process, который, в свою очередь, вызывает целевую функцию worker.
process.join() - Блокирует выполнение основного потока до тех пор, пока порожденный процесс не завершит выполнение. Это обеспечивает синхронизацию между процессами и предотвращает преждевременное завершение основного процесса.
Модуль `concurrent.futures`
Модуль `concurrent.futures` предоставляет высокоуровневый интерфейс для асинхронного выполнения вызовов функций.
import concurrent.futures
def worker():
return "Выполнение в потоке"
if __name__ == "__main__":
# Создание пула потоков
with concurrent.futures.ThreadPoolExecutor() as executor:
# Запуск функции в отдельном потоке
future = executor.submit(worker)
print(future.result()) # Получение результата выполнения
Модуль `threading`
import threading
import time
def worker(name):
print(f'Starting {name}')
time.sleep(2)
print(f'Ending {name}')
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(f'Thread-{i}',))
threads.append(t)
t.start()
for t in threads:
t.join()
Асинхронное программирование
Асинхронное программирование позволяет выполнять задачи в неблокирующем режиме, что увеличивает эффективность работы при вводе/выводе операций.
Асинхронное программирование с использованием `asyncio`
Модуль `asyncio` предоставляет асинхронные возможности и позволяет написать асинхронный код.
import asyncio
async def worker():
return "Выполнение в асинхронной функции"
async def main():
result = await worker()
print(result)
if __name__ == "__main__":
asyncio.run(main())
Использование библиотеки `aiohttp` для асинхронной работы с сетью и модулем `asyncio`
import aiohttp
import asyncio
async def fetch_data(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
html = await fetch_data("https://example.com")
print(html)
if __name__ == "__main__":
asyncio.run(main())
Сравнение параллельного и асинхронного программирования
Параметр | Параллельное программирование | Асинхронное программирование |
---|---|---|
Модель выполнения | Многопоточность или многопроцессорность | Однопоточность с использованием событийных циклов |
Цель | Увеличение производительности | Повышение отзывчивости и эффективности |
Использование CPU | Высокое, распределение задач по нескольким ядрам | Низкое, переключение контекста на долгих операциях |
Примеры задач | Обработка больших объемов данных, моделирование | Сетевое взаимодействие, взаимодействие с БД |
Сложность отладки | Высокая, сложно управлять состоянием между потоками | Умеренная, более предсказуемое поведение |
Инструменты | threading , multiprocessing |
asyncio , aiohttp |