我刚刚开始使用协程并阅读了 gevent 和 greenlet。为了进行测试,我通过 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 函数不是为每个请求生成新的 greenlet 吗?
您用什么来提出请求?我怀疑问题就出在这里。
我用 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,但您用于测试的方法似乎更有可能阻止每个请求。 IE。服务器支持并发,但您的客户端不支持。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)