nginx+uwsgi+Flask和多工艺

2024-05-19 18:42:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python flask脚本在uwsgi+nginx部署配置下运行。 我的uwsgi.ini文件文件:

[uwsgi]
pythonpath=/usr/bin/python3
socket=/tmp/grace.sock
chmod-socket = 666
vacuum = true
uid = www-data 
gid = www-data
plugin= python3
chdir= /home/grace/pyRep/beta_grace
module= app:app
enable-threads= true
master= true
processes= 3
#cheaper= 1
logto = /home/grace/pyRep/beta_grace/uwsgi.log
lazy-apps = true
single-interpreter=true

现在,在我的脚本中我有一个这样的函数:

^{pr2}$

看看我的日志,我发现: 全局变量:1 全局变量:1 全局变量:1

在我看来,这是因为启用了lazy apps选项,所以fork之后我有三个任务副本在运行,过了一段时间后,我发现:

全局变量:34 全局变量:32 全局变量:32

我尝试在@timer decorator之前使用@lock和@postfork decorator,但没有任何变化。如果我去掉lazy apps选项,我在连接mongoDB引擎和其他奇怪的行为时会遇到问题,所以我认为我必须保留它。 我找到的唯一解决方案是将进程限制为1,但这会降低性能。 有什么建议吗?!在


Tags: apps文件脚本truehomedatawwwsocket
2条回答

我想我找到了一个侵入性更小的解决方案,使用一个单一的过程和一个骡子,所以现在我uwsg.ini文件公司名称:

processes=1
mules=1

我的python脚本:

^{pr2}$

通过这种方式,我卸载了将计时器绑定到mule的主进程以及主进程上的其他任务。我想用2个过程+1个mule,但是
同样只有一个过程的速度是可以的!在

关键是不能在多个进程之间共享/使用简单变量(甚至全局变量)进行通信。在

可以找到IPC方法here

对于您的情况,我认为redis是一种解决方案,记住使用分布式锁

相关问题 更多 >