Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非阻塞并发wsgi服务器_Python_Flask_Wsgi_Uwsgi_Gevent - Fatal编程技术网

Python 非阻塞并发wsgi服务器

Python 非阻塞并发wsgi服务器,python,flask,wsgi,uwsgi,gevent,Python,Flask,Wsgi,Uwsgi,Gevent,我试图能够同时响应传入的web请求,而请求的处理包括相当长的IO调用。我将使用gevent,因为它应该是“非阻塞的” 我发现的问题是,即使我有很多gevent线程,请求也是按顺序处理的。由于某些原因,请求由单个绿色线程提供服务 我有nginx(默认配置,我想在这里不相关),还有uwsgi和简单的wsgi应用程序,它们将IO阻塞调用模拟为gevent.sleep()。这是: uwsgi.ini [uwsgi] chdir = /srv/website home = /srv/website/env

我试图能够同时响应传入的web请求,而请求的处理包括相当长的IO调用。我将使用gevent,因为它应该是“非阻塞的”

我发现的问题是,即使我有很多gevent线程,请求也是按顺序处理的。由于某些原因,请求由单个绿色线程提供服务

我有nginx(默认配置,我想在这里不相关),还有uwsgi和简单的wsgi应用程序,它们将IO阻塞调用模拟为gevent.sleep()。这是:

uwsgi.ini

[uwsgi]
chdir = /srv/website
home = /srv/website/env
module = wsgi:app
socket = /tmp/uwsgi_mead.sock
#daemonize = /data/work/zx900/mob-effect.mead/logs/uwsgi.log
processes = 1
gevent = 100
gevent-monkey-patch
wsgi.py

import gevent
import time
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    t0 = time.time()
    gevent.sleep(10.0)
    t1 = time.time()
    return "{1} - {0} = {2}".format(t0, t1, t1 - t0)
然后我在浏览器中同时(几乎)打开两个选项卡,结果如下:

1392297388.98 - 1392297378.98 = 10.0021491051 
# first tab, processing finished at 1392297378.98

1392297398.99 - 1392297388.99 = 10.0081849098 
# second tab, processing started at 1392297398.99

如您所见,第一个调用阻止了视图的执行。我做错了什么

使用curl或其他浏览器发送请求,因为浏览器对每个站点或每个地址的同时连接数有限制。或者使用两种不同的浏览器。

可能会增加
进程=1
?如果我想处理2-10个请求,那么是的,只需运行多个进程或线程,一天就可以了。我甚至不需要gevent。但我将同时处理数千个缓慢的请求,我显然需要一个事件循环,我肯定做了一些错事……我认为gunicorn的gevent(或eventlet)工作者会做你想做的事,虽然我自己并没有这样使用它。所示的示例是否适用于您?请尝试使用curl或浏览器以外的其他方式发送请求,因为浏览器对同时连接到同一站点的数量有限制。或者使用两种不同的浏览器。