Junior — Middle
71
Каким образом можно предотвратить блокировку асинхронных операций при выполнении задач, интенсивно использующих CPU?
Answer from AI
sobes.tech AI
Чтобы предотвратить блокировку асинхронных операций при выполнении CPU-интенсивных задач в Python, нужно избегать выполнения тяжёлых вычислений в основном потоке, который обрабатывает асинхронный цикл событий (event loop). Для этого можно:
- Использовать
concurrent.futures.ThreadPoolExecutorилиProcessPoolExecutorдля запуска CPU-интенсивных задач в отдельных потоках или процессах. - В случае asyncio, применять
loop.run_in_executor()для запуска блокирующих или тяжёлых функций в пуле потоков или процессов.
Пример с использованием run_in_executor:
import asyncio
import concurrent.futures
def cpu_bound_task(x):
# Тяжёлая вычислительная задача
return sum(i * i for i in range(x))
async def main():
loop = asyncio.get_running_loop()
with concurrent.futures.ProcessPoolExecutor() as pool:
result = await loop.run_in_executor(pool, cpu_bound_task, 10**7)
print(f"Результат: {result}")
asyncio.run(main())
Такой подход позволяет не блокировать основной асинхронный цикл и поддерживать отзывчивость приложения.