Вопрос проверяет понимание модели выполнения задач в asyncio и отличий от потоков.
Кооперативная многозадачность — это модель, при которой задачи сами добровольно передают управление, обычно через await. Планировщик не прерывает задачу принудительно, как это происходит в потоках. Благодаря этому уменьшаются накладные расходы и упрощается синхронизация. Такая модель широко используется в asyncio
Кооперативная многозадачность — это модель выполнения, при которой задачи работают до тех пор, пока сами не уступят управление.
В Python это реализовано через:
async def
await
event loop
Event loop выполняет задачи по очереди. Когда задача встречает await, она:
приостанавливается
передаёт управление циклу событий
возобновляется позже
Пример:
import asyncio
async def task():
print("start")
await asyncio.sleep(1)
print("end")
asyncio.run(task())
Во время sleep управление возвращается циклу событий.
В потоках:
переключение происходит принудительно
нужен контроль блокировок
В кооперативной модели:
переключение происходит явно
меньше проблем с гонками данных (если не использовать общие структуры неправильно)
Кооперативная многозадачность хорошо подходит для:
сетевых сервисов
HTTP-клиентов и серверов
систем с большим числом ожиданий I/O
Например:
FastAPI
aiohttp
Важно понимать:
CPU-нагруженные задачи блокируют event loop
для тяжёлых вычислений используют процессы или потоки
Кооперативная многозадачность эффективна для I/O-задач и масштабируемых сетевых сервисов, потому что позволяет обслуживать множество операций ожидания с минимальными затратами.