nginx + uwsgi + flask和多进程

时间:2018-05-16 16:07:55

标签: python nginx flask uwsgi

我有在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,但这会大大降低性能。 有什么建议吗?!

2 个答案:

答案 0 :(得分:0)

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

可以找到IPC方法here

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

答案 1 :(得分:0)

我认为我发现使用单个过程和骡子的侵入性较小的解决方案现在我的uwsg.ini:

processes=1
mules=1

和我的python脚本:

@timer(60,target='mule')

这样我卸载了我的主进程将计时器绑定到主进程上的mule和其他任务。我想过使用2个过程+ 1个骡子但是  也只有一个过程速度还可以!