FastAPI实现多进程部署

1 fastAPI多进程部署

fastAPI默认是单进程部署,如果需要多进程部署,需要添加worker参数

  • app:需要是字符串,文件名:app
  • workers:进程数量,一般等于CPU数量即可
uvicorn.run(app='sisRealData2RestfulAPI:app',host='0.0.0.0',port=8000,workers=10)

特别注意:多进程部署不要添加reload参数

源码如下,

@property
def should_reload(self):
    return isinstance(self.app, str) and (self.debug or self.reload)
if (config.reload or config.workers > 1) and not isinstance(app, str):
    logger = logging.getLogger("uvicorn.error")
    logger.warning(
        "You must pass the application as an import string to enable 'reload' or "
        "'workers'."
    )
sys.exit(1)
if config.should_reload:
    sock = config.bind_socket()
    ChangeReload(config, target=server.run, sockets=[sock]).run()
elif config.workers > 1:  # 必须走这个分支才能多进程部署
    sock = config.bind_socket()
    Multiprocess(config, target=server.run, sockets=[sock]).run()
else:
    server.run()
  • should_reload必须为False,即reload和debug都不能开,并且app必须是带引号的字符串格式

2 问题

看起来fastAPI的多进程不太智能,开启三个进程,用六次请求,其中连续三次都走的一个进程,导致CPU没有被充分利用,目前策略是多开进程