如何防止Google App Engine运行多个并发实例?
问题原因
你当前的部署配置是把后台循环代码当作Web服务来运行,而GAE的Python 3运行时(script: auto)默认会启动多个Gunicorn worker进程(通常为4个)处理HTTP请求。每个worker进程都会加载你的main.py,执行模块级别的while True循环,所以会同时出现多个进程打印Hello world!——这和你设置的单实例无关,单实例内部可以存在多个worker进程。
解决方案
要实现单实例单进程运行你的后台循环,需要修改部署配置,直接指定启动命令,跳过Web服务的多worker机制:
- 修改
app.yaml,移除handlers和script: auto,添加entrypoint指定直接运行main.py:
runtime: python38 service: default manual_scaling: instances: 1 entrypoint: python main.py
- 重新部署(注意更新版本号):
gcloud app deploy --stop-previous-version --version test-0-0-4
部署完成后,GAE会在单个实例中启动单个Python进程运行你的无限循环,日志里只会同时输出一条Hello world!,能避免后续业务代码出现重复数据库插入的问题。
额外说明
如果你的业务代码是长期运行的后台任务,这种entrypoint直接启动脚本的方式才是正确选择。handlers配置用于处理HTTP请求的Web服务场景,并不适合后台循环类任务。
内容的提问来源于stack exchange,提问作者Brian Ivander T. P.
相关产品推荐
相关产品推荐

