我有在uwsgi + nginx部署配置下运行的python-flask脚本。 我的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
现在,在我的脚本中我有这样的函数:
from uwsgidecorators import *
@timer(60)
def foo():
global_var += 1
print(global_var)
查看我的日志,我发现: global_var:1 global_var:1 global_var:1
在我看来这是由于启用了懒惰的应用程序选项,所以在fork之后我运行了这个任务的三个副本,并且在一段时间后我发现:
global_var:34 global_var:32 global_var:32
我在@timer装饰器之前尝试使用@lock和@postfork装饰器,但没有任何改变。如果我拿出lazy-apps选项,我在连接到mongoDB引擎和其他奇怪的行为时遇到问题,所以我认为我必须保留它。 我找到的唯一解决方案是将进程限制为1,但这会大大降低性能。 有什么建议吗?!
答案 0 :(得分:0)
答案 1 :(得分:0)
我认为我发现使用单个过程和骡子的侵入性较小的解决方案现在我的uwsg.ini:
processes=1
mules=1
和我的python脚本:
@timer(60,target='mule')
这样我卸载了我的主进程将计时器绑定到主进程上的mule和其他任务。我想过使用2个过程+ 1个骡子但是 也只有一个过程速度还可以!