2013-02-13 35 views
5

我正在尝试使用gunicorn及其异步工作者的长时间运行请求,但是我找不到任何可以工作的示例。我使用的例子here但扭捏返回响应之前增加一个假的延迟(睡眠5秒):gunicorn不同时处理同时发生的请求

def app(environ, start_response): 
    data = "Hello, World!\n" 
    start_response("200 OK", [ 
     ("Content-Type", "text/plain"), 
     ("Content-Length", str(len(data))) 
    ]) 
    time.sleep(5) 
    return iter([data]) 

然后我跑gunicorn这样:

gunicorn -w 4 myapp:app -k gevent

当我打开两个浏览器并在其中输入http://127.0.0.1:8000/,并几乎同时发送请求,这些请求似乎按顺序处理 - 一个在5秒后返回,另一个在后返回 5秒。

问:我猜睡眠不是友好的吗?但是有4名工人,所以即使工人的类型是“同步”,两名工人也应该同时处理两个请求。

+0

您是否找到解决方案? – 2013-09-24 10:47:58

+0

对不起,我没有。 – swoop81 2013-09-24 15:53:22

回答

5

我刚碰到同样的东西,在这里打开一个问题:Requests not being distributed across gunicorn workers。结果是,浏览器似乎序列化访问同一页面。我猜测这可能与缓存能力有关,也就是说浏览器认为它可能是可缓存的页面,等到它加载时发现它并不是如此,这会产生另一个请求等等。

+0

这么烦人,那么简单... :( – jwg 2017-09-08 18:15:23

+0

Thanks @CrazyCasta。我已经通过安装另一个浏览器并同时发送来自两个独立浏览器(铬和firefox)的请求来验证您的答案,并且请求确实得到并行服务 – swoop81 2017-11-07 22:33:25

0

gevent.sleep一击而不是time.sleep

这很奇怪,-w 4发生这种情况,但-k gevent是异步工作者类型,所以有可能gunicorn将这两个请求提供给同一个客户端。假设发生了什么,time.sleep将锁定您的进程,除非您使用gevent.monkey.patch_all()

1

当使用非阻塞工人类型的gunicorn(如gevent)时,它将只使用一个处理请求的进程,因此顺序执行5秒钟的工作并不令人惊讶。

当你的工作负载很轻并且请求速度很快时,异步工作器很有用,在这种情况下,gunicorn可以利用等待IO时浪费的时间(例如,等待套接字可写入来写入响应) , 通过切换到另一个工作人员来处理另一个请求。 通过切换到另一个分配给同一个工作人员的请求。

UPDATE

我错了。

当使用非阻塞工人类型的gunicorn,在gunicorn中的工作人员设置时,每个工人都是一个进程,它运行一个单独的队列。

因此,如果time.sleep在不同的进程上运行,它将同时运行,但是当它运行在同一个worker中时,它将按顺序执行。

问题是gunicorn loadbalancer可能没有将这两个请求分配到两个工作进程中。您可以通过os.getpid()检查当前进程。

+0

Gunicorn不使用一个进程来处理请求;它使用您指定的编号作为'-w'标志。 – 2015-11-07 22:51:44

+0

@ ron.rothman这是真的!我的解释是错误的,谢谢提及。 – tdihp 2015-11-09 01:28:35

相关问题