Переключится ли Event Loop, если одна из корутин занята CPU bound задачей
Python
Middle
Без компании
Переключится ли Event Loop, если одна из корутин занята CPU bound задачей
Ответы
Нет, Event Loop в asyncio не переключится автоматически при выполнении CPU-bound задачи в корутине. Asyncio работает кооперативно - корутина должна явно отдавать управление с помощью `await`.
CPU-bound операции блокируют поток, не давая Event Loop обрабатывать другие корутины. Для таких задач лучше использовать:
- `loop.run_in_executor()` для выноса в отдельный поток/процесс
- Модуль `multiprocessing`
- Специализированные библиотеки типа `aiojobs`
Пример:
```
import asyncio
async def cpu_bound():
# Блокирующая операция
sum(i*i for i in range(10**7))
print("CPU bound done")
async def other_task():
while True:
print("Other task running")
await asyncio.sleep(1)
async def main():
await asyncio.gather(
cpu_bound(), # Блокирует event loop
other_task() # Не будет выполняться
)
asyncio.run(main())
```
Решение - использовать executor:
```
async def cpu_bound():
loop = asyncio.get_running_loop()
await loop.run_in_executor(None, lambda: sum(i*i for i in range(10**7)))
```