Встречается на собеседованиях • сегодня

Переключится ли Event Loop, если одна из корутин занята CPU bound задачей

Нет, Event Loop в asyncio не переключится автоматически при выполнении CPU-bound задачи в корутине. Asyncio работает кооперативно - корутина должна явно отдавать управление с помощью await.

CPU-bound операции блокируют поток, не давая Event Loop обрабатывать другие корутины. Для таких задач лучше использовать:

  1. loop.run_in_executor() для выноса в отдельный поток/процесс
  2. Модуль multiprocessing
  3. Специализированные библиотеки типа aiojobs

Пример:

python
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:

python
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)))
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы