Что такое кооперативная многозадачность в контексте Python

Ответ

Кооперативная многозадачность — это модель конкурентности, при которой задачи (корутины) добровольно уступают контроль над процессором, позволяя другим задачам выполняться. В отличие от вытесняющей многозадачности, где операционная система принудительно переключает контекст, здесь переключение происходит только в явных точках, например, при вызове await.

Этот подход идеально подходит для I/O-bound операций (сетевые запросы, работа с файлами), так как программа может выполнять другую работу, пока ожидает ответа от внешнего ресурса.

Ключевые особенности в Python:

  • Ключевые слова: async def для объявления корутин и await для передачи управления.
  • Event Loop: Оркестратор (asyncio), который управляет запуском и переключением корутин.
  • Блокировка: Одна долго выполняющаяся синхронная операция (без await) может заблокировать весь event loop и все остальные задачи.

Пример с asyncio:

import asyncio

async def task(name, delay):
    print(f"Задача {name} началась")
    await asyncio.sleep(delay) # Добровольно отдаем управление на время ожидания
    print(f"Задача {name} завершилась")

async def main():
    # Задачи выполняются конкурентно, а не последовательно
    await asyncio.gather(
        task("A", 2),
        task("B", 1)
    )

asyncio.run(main())

# Вывод:
# Задача A началась
# Задача B началась
# Задача B завершилась
# Задача A завершилась