能否使用Ray配合Uvicorn/Blacksheep实现多线程服务部署?
你的方案不可行,且对Uvicorn的并发模型存在理解偏差
首先明确:Uvicorn本身就原生支持多进程/多线程的并发部署,根本不需要额外用Ray来实现“每个核心起一个线程/进程”的需求,你的方案不仅绕远路,还会引发一堆问题。
为什么你的Ray方案行不通?
- 端口冲突问题:每个Ray Actor是独立进程,你如果给每个核心都起一个,相当于多个Uvicorn实例同时监听同一个端口,系统会直接报错(端口只能被一个进程绑定)。
- 对象序列化问题:你在主进程创建的
app对象,要传递到Ray的Actor进程中,Blacksheep的Application对象并不支持跨进程序列化,会直接抛出序列化错误。 - 阻塞问题:Uvicorn的
run()方法是阻塞式的,每个Ray Actor调用start_server()后会一直卡在那里,完全浪费了Ray的分布式调度能力。
正确的多核心部署方式(直接用Uvicorn原生能力)
Uvicorn自带workers参数指定worker进程数,通常设置为和CPU核心数一致,还可以用threads参数给每个worker进程配置线程数,这是官方推荐的生产级部署方式:
from blacksheep import Application import uvicorn import multiprocessing app = Application() @app.route("/") async def home(): return "Hello, World!" if __name__ == "__main__": uvicorn.run( app, host="0.0.0.0", port=8000, workers=multiprocessing.cpu_count(), threads=4 # 每个worker进程的线程数,可根据业务调整 )
如果你确实需要用Ray做分布式计算
如果你的场景是Web服务需要调用耗时的分布式计算任务,正确的做法是把Web服务和Ray计算逻辑分开:Uvicorn正常用多进程部署,在请求处理函数里调用Ray的远程任务,而不是用Ray来启动Uvicorn实例:
from blacksheep import Application import uvicorn import ray import multiprocessing # 初始化Ray集群 ray.init() app = Application() # Ray远程计算任务 @ray.remote def heavy_task(): # 这里放耗时的计算逻辑 return "计算完成" @app.route("/") async def home(): # 在请求中调用Ray任务 task_result = ray.get(heavy_task.remote()) return f"Hello, World! {task_result}" if __name__ == "__main__": uvicorn.run( app, host="0.0.0.0", port=8000, workers=multiprocessing.cpu_count() )
内容的提问来源于stack exchange,提问作者BAR
相关产品推荐
相关产品推荐

