Я хочу запустить приложение starlette и django в одном потоке.
(Наличие их в одном потоке обеспечивает быструю локальную связь между ними).
Учитывая, что приложения asgi - это просто сопрограммы, я подумал, что это теоретически возможно с asyncio.gather()
.
Я придумал небольшой прием, чтобы заставить эту работу работать, но у него есть некоторые ограничения.
from uvicorn import Server, Config
configs = [Config(app1, uds='app1.sock'), Config(app2, uds='app2.sock')]
coros = [Server(c).serve() for c in configs]
await asyncio.gather(*coros)
- Не поддерживает параметры
reload
иworkers
. - Ctrl + C работает только для одного приложения.
INFO: Started server process [86066]
INFO: Waiting for application startup.
INFO: Started server process [86066]
INFO: Waiting for application startup.
INFO: ASGI 'lifespan' protocol appears unsupported.
INFO: Application startup complete.
INFO: Uvicorn running on unix socket app1.sock (Press CTRL+C to quit)
INFO: Application startup complete.
INFO: Uvicorn running on unix socket app2.sock (Press CTRL+C to quit)
^CINFO: Shutting down
INFO: Finished server process [86066]
^C^C^C^C^C
Как лучше это сделать?