gpt4 book ai didi

python - 使用 uvicorn 在同一线程中运行多个 asgi 应用程序

转载 作者:行者123 更新时间:2023-12-04 14:16:02 29 4
gpt4 key购买 nike

我想在同一个线程中运行 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)

  • 不支持 reloadworkers选项。
  • 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

    有什么更好的方法来做到这一点?

    最佳答案

    更新 - 如果您在 2 个应用程序之间分离了路径,您可以使用它来跳过 starlette 的中间件:

    from mydjangoapp.asgi import application as django_app

    ws_app = Starlette(...)

    async def app(scope, receive, send):
    path = scope.get("path")
    chosen = ws_app
    if not (path is None or path.startswith("/ws")):
    chosen = django_app
    return await chosen(scope, receive, send)

    傻我! Starlette 支持挂载任意 ASGI 应用程序,这意味着您只需执行以下操作并从命令行使用任何 ol' ASGI 服务器。

    from mydjangoapp.asgi import application as django_app

    app = Starlette(...)

    app.mount('/', django_app)

    关于python - 使用 uvicorn 在同一线程中运行多个 asgi 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60182619/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com