使用Gevent和WSGI阻止调用

时间:2011-08-17 19:23:29

标签: wsgi blocking coroutine gevent

我刚刚开始使用协同程序,并已阅读gevent和greenlets。对于测试,我通过gevents pywsgi模块提供了此代码:

from gevent.pywsgi import WSGIServer
import gevent

def hello_world(env, start_response):
    gevent.sleep(5)
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["<b>hello world</b>"]

print 'Serving on 8088...'
WSGIServer(('127.0.0.1', 8888), hello_world).serve_forever()

我期待一个结果,在显示文本之前,每个请求都会有5秒的延迟。然而,所发生的是每个请求都通过调用gevent.sleep()排队等候,如果第二个请求在第一个请求之后立即启动,则第二个请求将花费大约10秒。

serve_forever函数不是为每个请求生成新的greenlets吗?

2 个答案:

答案 0 :(得分:6)

你用什么来提出要求?我怀疑那里存在问题。

我用ab(Apache Benchmark)测试了你的代码并得到了这个(输出编辑):

$ ab -c 200 -n 200 http://localhost:8888/

Completed 100 requests
Completed 200 requests
Finished 200 requests

Concurrency Level:      200
Time taken for tests:   5.048 seconds
Requests per second:    39.62 [#/sec] (mean)
Time per request:       5048.386 [ms] (mean)

ab命令向gevent服务器发出200个并发请求。五秒钟后,所有请求都已完成。如果请求排队,正如您所建议的那样,此基准测试需要1000秒。

我认为您的系统可能无法正确支持greenlet,但您使用的方法似乎更有可能阻止每个请求。即服务器支持并发,但客户端不支持。

答案 1 :(得分:0)

众所周知,浏览器会将请求排入同一个域。

尝试打开不同的浏览器(不同的浏览器窗口,实际上是不同的应用程序,例如FF和Chrome)以进行不同的连接。