我对mod_wsgi的多重管理功能以及将在具有多处理能力的WSGI服务器上执行的WSGI应用程序的一般设计感到困惑.
请考虑以下指令:
WSGIDaemonProcess example processes=5 threads=1
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,mod_wsgi将生成5个Python(例如CPython)进程,并且这些进程中的任何一个都可以接收来自用户的请求.
文件说:
共享数据需要对所有应用程序实例可见,无论它们执行哪个子进程,并且一个应用程序对数据所做的更改都可以立即供另一个应用程序使用,包括在另一个子进程中执行的任何子进程,外部数据存储,如必须使用数据库或共享内存.普通Python模块中的全局变量不能用于此目的.
但是在这种情况下,当想要确定应用程序在任何WSGI条件(包括多处理条件)中运行时,它会变得非常沉重.
例如,一个包含当前连接用户数量的简单变量 - 它应该是从/向memcached进行过程安全读/写,还是DB或(如果有这样的标准库机制可用)共享记忆?
并且代码会像
counter = 0
@app.route('/login')
def login():
...
counter += 1
...
@app.route('/logout')
def logout():
...
counter -= 1
...
@app.route('/show_users_count')
def show_users_count():
return counter
Run Code Online (Sandbox Code Playgroud)
在多处理环境中表现不可预测?
谢谢!
我正在使用ubuntu 12.041并通过apt-get安装了apache.
我不知道我正在使用什么版本的mod_wsgi,虽然我谷歌关于它.我发现你可以使用apachctl重新启动你的apache,你会得到类似"Apache/2.2.2(Unix)mod_wsgi/1.0 Python/2.3配置"的东西.但这并没有发生在我身上.
有什么方法可以知道我使用的是什么版本?谢谢.
我正在尝试将参数传递给示例wsgi应用程序,:
config_file = sys.argv[1]
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World %s" % config_file]
Run Code Online (Sandbox Code Playgroud)
并运行:
uwsgi --http :9090 --wsgi-file test_uwsgi.py -???? config_file # argument for wsgi script
Run Code Online (Sandbox Code Playgroud)
我能做到的任何聪明方式吗?无法在uwsgi文档中找到它.也许还有另一种方法可以为wsgi应用程序提供一些参数?(环境变量超出范围)
我在守护进程模式下运行apache mod_wsgi上的wsgi应用程序.我在配置中有这些行
WSGIDaemonProcess app processes=2 threads=3 display-name=%{GROUP}
WSGIProcessGroup app
Run Code Online (Sandbox Code Playgroud)
如何找到进程和线程的最佳组合/调优?
编辑:此链接[在下面的回答中给出]是非常有用的:https: //serverfault.com/questions/145617/apache-2-2-mpm-worker-more-threads-or-more-processes/146382#146382
现在,我的问题是:如果我的服务器为我的需求提供了相当好的性能,我应该减少线程数以提高稳定性/可靠性吗?我可以把它设置为1吗?
我正在尝试使用uwsgi运行Django应用程序.我发现的大多数指令都引用了"--wsgi-file"和"--module"来指定应用程序,但是"uwsgi"没有提到这些选项,当我尝试使用它们时:
uwsgi -s /tmp/uwsgi.sock --master --module myapp.wsgi
uwsgi: unrecognized option '--module'
getopt_long() error
Run Code Online (Sandbox Code Playgroud)
和
uwsgi -s /tmp/uwsgi.sock --master --wsgi-file myapp/wsgi.py
uwsgi: unrecognized option '--wsgi-file'
getopt_long() error
Run Code Online (Sandbox Code Playgroud)
当我没有任何一个运行时,我得到:
uwsgi -s /tmp/uwsgi.sock --master
*** Starting uWSGI 2.0.9 (64bit) on [Fri Jul 10 11:12:04 2015] ***
compiled with version: 4.4.7 20120313 (Red Hat 4.4.7-11) on 23 April 2015 19:31:15
os: Linux-2.6.32-504.16.2.el6.x86_64 #1 SMP Tue Mar 10 17:01:00 EDT 2015
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 2 …Run Code Online (Sandbox Code Playgroud) 我有一台服务器,需要几分钟时间来处理特定请求然后响应它.
客户端必须等待响应,而不知道何时完成.
有没有办法让客户知道处理状态?(比如50%完成,80%完成),客户不需要轮询状态.
Flask的hello world演示是:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
Run Code Online (Sandbox Code Playgroud)
如果我这样修改了怎么办:
from flask import Flask
app = Flask(__name__)
a = 1
b = 2
c = 3
@app.route("/")
def hello():
a += 1
b += a
c += b
return "Hello World!"
if __name__ == "__main__":
app.run()
Run Code Online (Sandbox Code Playgroud)
我理解WSGI应用程序可能有多个线程.该hello函数可以同时在多个线程上运行,然后我们就会遇到竞争条件.它是否正确?如果上面的代码不是线程安全的,我该怎么做才能使它的线程安全?
避免全局变量是一种可能的解决方案,但是你总能避免使用全局变量吗?如果我想要类似python对象缓存的内容怎么办?
是否有Flask或Jinja2配置标志/扩展名来在渲染模板后自动缩小HTML输出?
我想在用户登录时设置cookie.
我的中间件:
class UserStatus(object):
def process_response(self,request,response):
user_status = 1 if request.user.is_authenticated() else 0
max_age = (20)*52*7*24*60*60 # 20 years (After expiry, cookie gets deleted)
response.set_cookie(user_status_cookie,user_status,max_age)
return response
Run Code Online (Sandbox Code Playgroud)
最后添加到MIDDLEWARE_CLASSESsettings.py中.
问题:
我使用Flask构建了一个基本的Web应用程序,并且能够使用其本机http服务器从虚拟机运行它.我很快意识到,通过这个设置,请求被阻止(我无法对资源进行并发请求;任何新请求都要等到早期请求完成),并决定尝试使用gunicorn运行应用程序来解决此问题.我按照文档,特别是使用此行运行:
gunicorn -w 4 -b 127.0.0.1:4000 myproject:app
Run Code Online (Sandbox Code Playgroud)
但是,它无法启动这样做,并抱怨没有WSGI应用程序.在互联网上闲聊,我发现有很多人发布了以下示例:
from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
Run Code Online (Sandbox Code Playgroud)
我补充说,它解决了我的问题.我很困惑,因为这显然是为了解决在HTTP代理后面服务的问题,但是增加的gunicorn会强加一个HTTP代理吗?或者我总是落后于代理,而Flask的内置服务器并不重要?
此外,Werkzeug关于Fixers的文档警告"出于安全原因,不要在非代理设置中使用此中间件." 考虑到修复显然是必要的,我可以假设我正在进行代理设置吗?