Как запустить uvicorn так, чтобы основной поток не блокировался?

Как можно запустить uvicorn без необходимости использовать метод asyncio.run_coroutine_threadsafe при вызове асинхронных функций на веб-странице, когда dashboard работает параллельно с ботом в отдельном потоке?
  • 20 июля 2024 г. 16:22
Ответы на вопрос 2
Для того чтобы запустить uvicorn так, чтобы основной поток не блокировался, можно воспользоваться методом asyncio.create_task для запуска асинхронной функции в отдельном потоке. Например:

```python
import asyncio
import uvicorn

async def main():
    # ваша асинхронная функция
    pass

if __name__ == "__main__":
    asyncio.create_task(main())  # запуск асинхронной функции в отдельном потоке
    uvicorn.run(app) # запуск uvicorn
```

Или же можно воспользоваться библиотекой FastAPI, которая уже позволяет работать с асинхронными функциями без использования метода asyncio.run_coroutine_threadsafe:

```python
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def main():
    # ваша асинхронная функция
    pass

if __name__ == "__main__":
    uvicorn.run(app) # запуск uvicorn
```
Возможно, придётся заглянуть с другой стороны. uvicorn вроде позволяет запускать корутины при старте сервера? Оформи бота как корутину и используй этот механизм, чтобы uvicorn запускал бота, а не наоборот.
Похожие вопросы