Для того чтобы запустить 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
```