如何通过代码调用Hypercorn的serve接口配置多worker启动FastAPI应用
Hypercorn 代码启动多worker不生效问题解决方案
警告原因
hypercorn.asyncio.serve 函数仅用于启动单个工作进程的服务实例,workers 配置项是 Hypercorn 主进程用来调度多进程资源的参数,直接调用 serve 不会触发多进程逻辑,因此配置不生效且会触发警告。
你之前查阅的文档中提到的 serve 函数适用场景是嵌入现有asyncio runtime的单进程服务部署,和你需要的多进程启动场景不匹配。
正确实现方案
直接使用 Hypercorn 提供的 run 方法即可,该方法和命令行启动逻辑完全一致,会自动处理多worker调度,你的配置可以直接复用:
import logging from hypercorn.config import Config from hypercorn import run from api.app import app mainLog = logging.getLogger('main') # 原有logging配置逻辑直接保留即可 ... 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: run(app, config) except Exception: mainLog.exception('Fail to start server')
该方案和你原来使用的命令行启动效果完全一致,所有配置项都会正常生效。
可选方案:自行实现多进程调度
如果有特殊需求需要自己控制进程逻辑,可以通过multiprocessing库启动多个进程,每个进程内单独调用serve函数,注意需要额外开启端口复用配置:
config.reuse_port = True
内容的提问来源于stack exchange,提问作者daria
相关产品推荐
相关产品推荐

