我想在同一个线程中运行一个 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
有什么更好的方法来做到这一点?