Встречается на собеседованиях • сегодня
Переключится ли Event Loop, если одна из корутин занята CPU bound задачей
Нет, Event Loop в asyncio не переключится автоматически при выполнении CPU-bound задачи в корутине. Asyncio работает кооперативно - корутина должна явно отдавать управление с помощью await.
CPU-bound операции блокируют поток, не давая Event Loop обрабатывать другие корутины. Для таких задач лучше использовать:
loop.run_in_executor()для выноса в отдельный поток/процесс- Модуль
multiprocessing - Специализированные библиотеки типа
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)))
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
офферы быстрее!
Попробовать бесплатно
Следующий вопрос
Это единственный вопрос по вашему фильтру
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы