В чем отличие асинхронности, threading'га и мультипроцессинга?
Этот вопрос проверяет понимание основных методов параллельного и конкурентного выполнения задач в Python, а также различие между асинхронностью, потоками и процессами.
Короткий ответ
Асинхронность, многозадачность с потоками (threading) и многозадачность с процессами (multiprocessing) — это разные подходы к выполнению нескольких задач. Асинхронность используется для работы с долгими операциями без блокировки, потоки позволяют выполнять задачи параллельно в одном процессе, а процессы выполняются в отдельных адресных пространствах.
Длинный ответ
Каждый из этих методов решает проблему выполнения нескольких операций одновременно, но подходит для разных типов задач:
- Асинхронность: Позволяет эффективно обрабатывать задачи ввода-вывода (например, сетевые запросы), не блокируя выполнение программы. Использует один поток, но позволяет запускать несколько операций, не ожидая завершения каждой. Применяется с помощью asyncio в Python.
- Threading (потоки): В одном процессе запускаются несколько потоков, которые выполняются параллельно. Однако, из-за глобальной блокировки интерпретатора (GIL), потоки в Python не могут выполнять вычислительно интенсивные задачи параллельно. Подходит для задач, которые требуют асинхронного ввода-вывода.
- Multiprocessing (мультипроцессинг): Каждый процесс работает в своём собственном адресном пространстве, что позволяет выполнять задачи параллельно без влияния GIL. Этот подход подходит для CPU-ограниченных задач, например, вычислений.
Пример асинхронности:
import asyncio
async def task():
print("Start task")
await asyncio.sleep(1)
print("End task")
asyncio.run(task())
Пример многозадачности с потоками:
import threading
def task():
print("Start task")
thread = threading.Thread(target=task)
thread.start()
thread.join()
Пример многозадачности с процессами:
import multiprocessing
def task():
print("Start task")
process = multiprocessing.Process(target=task)
process.start()
process.join()