Sobes.tech
Junior — Middle
95

Come si può evitare che le operazioni asincrone si blocchino durante l'esecuzione di compiti intensivi della CPU?

Risposta dell'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())

Такой подход позволяет не блокировать основной асинхронный цикл и поддерживать отзывчивость приложения.