【问题标题】:How to use workers with hypercorn serve?如何使用带有超级玉米服务的工人?
【发布时间】:2021-10-27 12:46:34
【问题描述】:

我想使用 main.py 中的 hypercorn 启动我的 FastAPI 应用程序。

我使用这个命令手动启动服务器:

hypercorn --access-logformat "%(R)s %(s)s %(st)s %(D)s %({Header}o)s" --access-logfile - -b 0.0.0.0:8000 -w 9 app:app

现在我需要从我的代码中做同样的事情。第一次尝试是:

from hypercorn.config import Config
from hypercorn.asyncio import serve

from api.app import app # app = FastAPI()

config = Config()
config.bind = ['0.0.0.0:8000']
config.access_log_format = '%(R)s %(s)s %(st)s %(D)s %({Header}o)s'
config.accesslog = mainLog # mainLog = logging.getLogger('main')
config.loglevel = 'INFO'

asyncio.run(serve(app, config))

我尝试设置 config.workers = 9 ,但作为回应,我得到了:

Warning: The config `workers` has no affect when using serve
  warnings.warn("The config `workers` has no affect when using serve", Warning)

然后我将我的代码重写为:

import logging
import asyncio

from hypercorn.config import Config
from hypercorn.asyncio import serve

from api.app import app


mainLog = logging.getLogger('main')
...

async def main(app, config):
    await  serve(app, config)

if __name__ == "__main__":
    config = Config()
    config.bind = ['0.0.0.0:8000']
    config.access_log_format = "%(R)s %(s)s %(st)s %(D)s %({Header}o)s"
    config.accesslog = mainLog
    config.loglevel = 'INFO'
    config.worker_class = 'asyncio'
    config.workers = 9
    try:
        loop = asyncio.get_event_loop()
        loop.run_until_complete(main(app, config))

    except:
        mainLog.exception('Fail to start server')

但我仍然收到同样的警告。 Documentation 说:

... 可以通过可用于 asyncio 或 trio Workers 的 serve 函数以编程方式使用 Hypercorn(注意 asyncio serve 可与 uvloop 一起使用)。

我误解了文档吗?我缺乏这方面的知识,所以请帮助我。

【问题讨论】:

    标签: python python-asyncio hypercorn


    【解决方案1】:

    没有开箱即用的功能,尽管我可以看到文档可能会产生误导。我对必须以不同格式提供配置做出了同样的错误假设。这不是问题。

    如果您将 hypercorn 作为独立的可执行文件运行,则支持多个工作进程,正如您提到的那样,您一开始就是这样做的。但它们在任何其他配置中均不受支持。

    如果您通过其serve() API 运行 hypercorn,则期望 将实现流程管理。

    如果您查看src/hyperhorn/run.py,您将看到 Hypercorn 为实现多个工作进程所做的工作。您需要在代码中复制它。因此,您需要自己创建这些进程,然后在每个进程中设置它们的异步循环,而不是像 config.workers = 9 这样的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多