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   荣锋亮  阅读(492)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2022-11-11 github codespaces 可以使用了
2022-11-11 parcel segmentation fault 问题以及解决方法
2021-11-11 Faster Change Data Capture for your Data Lake
2021-11-11 使用jHiccup 分析java 应用性能
2020-11-11 sql/driver: couldn't convert "\x00" into type bool 问题
2020-11-11 linux crontab 简单说明
2019-11-11 yugabyte 安装pg_hashids 扩展

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示