fastapi uvicorn 多进程处理

uvicorn 对于多进程的支持可以通过配置wokers 参数,但是一般我们都使用的是模块类模式,并不是字符串(只有字符串模式才能生效)

以下是基于multiprocessing 如何实现类似的功能(机制上实际与uvicorn 的多worker是类似的)

参考代码

import multiprocessing as mp
from fastapi import FastAPI
import uvicorn
import copy
mp.allow_connection_pickling()
app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}


def start_server(app,sockets,port):
    servers = []
    for _ in range(number_of_processes):
        app = copy.copy(app)
        config = uvicorn.Config(app=app,port=port,host="0.0.0.0",log_level="info")
        server = uvicorn.Server(config=config)
        # 通过multiprocessing 以及server 共享socket模式进行多进程的管理
        w = mp.get_context('fork').Process(target=server.run, args=(sockets,))
        w.start()
    servers.append(w)
    return servers

if __name__ == '__main__':
    number_of_processes = 4
    port = 8000
    config = uvicorn.Config(app=app, host="0.0.0.0", port=port, log_level="info")
    sockets = [config.bind_socket()]
    set_of_servers = start_server(app,sockets,port)
    for server in set_of_servers:
        server.join()

说明

LitServe 就使用了类似的技术进行多worker的支持

参考资料

https://github.com/Lightning-AI/LitServe

https://github.com/encode/uvicorn/blob/master/uvicorn/supervisors/multiprocess.py

posted on 2024-11-11 08:00  荣锋亮  阅读(285)  评论(0编辑  收藏  举报

导航