Hypercorn运行出现重复进程问题求助
我不确定这是否是Hypercorn的问题,但想不到其他可能原因。已搜索网络但未找到类似问题。
环境:Ubuntu 20.04系统、Python3.8.10
运行Hypercorn服务器时,后台会启动重复进程,进程信息如下:
root 2278497 0.8 0.1 41872 33568 pts/7 S 10:03 0:00 /usr/bin/python3 /usr/local/bin/hypercorn -c config.toml main:app --reload root 2278499 0.0 0.0 17304 11332 pts/7 S 10:03 0:00 /usr/bin/python3 -c from multiprocessing.resource_tracker import main;main(4) root 2278500 0.7 0.1 41648 34148 pts/7 S 10:03 0:00 /usr/bin/python3 -c from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=5, pipe_handle=7) --multiprocessing-fork
主进程为2278497,但存在2278499和2278500两个额外进程,不清楚它们的启动原因。这会导致同一任务被执行两次,请问如何避免这种情况?
编辑补充:最小复现代码示例
# test_main.py from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"} print("main module loaded.")
执行命令:
sudo hypercorn test_main:app
标准输出:
main module loaded. main module loaded. [2022-11-02 15:08:45 +0100] [2364437] [INFO] Running on http://127.0.0.1:8000 (CTRL + C to quit)
问题原因与解决方法
原因分析
Hypercorn默认会以多进程模式启动(未指定worker数量时,会根据CPU核心数自动创建worker进程),每个worker都会加载一次你的应用模块,因此会出现多次打印main module loaded.的情况。另外,resource_tracker是Python multiprocessing模块自带的资源跟踪辅助进程,属于正常系统进程,无需额外处理。
解决方法
指定单worker进程启动
在启动命令中添加--workers 1参数,强制Hypercorn只启动一个worker进程:sudo hypercorn test_main:app --workers 1这样模块只会被加载一次,也不会出现额外的业务worker进程。
调整模块内任务执行时机
如果你的任务是在模块加载时执行(比如示例中的print),可以将其放到if __name__ == "__main__":块中,确保只有直接运行脚本时才执行,避免worker进程重复执行:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
if name == "main":
print("main module loaded.")
3. **通过配置文件指定worker数量** 若使用`config.toml`配置文件,在文件中添加: ```toml workers = 1
启动时加载配置文件即可:
sudo hypercorn -c config.toml main:app --reload
内容的提问来源于stack exchange,提问作者stev

