我刚刚开始使用协同程序,并阅读了有关 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 吗?
最佳答案
您使用什么来发出请求?我怀疑问题出在这里。
我用 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 秒。
我想您的系统可能没有正确支持 greenlets,但更有可能是您用来测试的方法在每个请求上都被阻塞了。 IE。服务器支持并发,但您的客户端不支持。
关于wsgi - 使用 Gevent 和 WSGI 阻止调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7098284/