wsgi - 使用 Gevent 和 WSGI 阻止调用

标签 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 吗?

最佳答案

您使用什么来发出请求?我怀疑问题出在这里。

我用 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/

相关文章:

ios - 等待 block 完成吗?

php - file_get_contents() 是阻塞函数吗?

c++ - 如何将组合的 Asio 操作与 C++20 协程一起使用以返回值?

kotlin - 在协程中使用 runBlocking 时会发生什么坏事吗?

lua协程作为迭代器: cannot resume dead coroutine

python - 使用 WSGI 和 Python 3 提供静态文件

csv - 如何使用 Python 3 处理从 Web 表单上传的 csv 文件?

c# - 碰撞时阻止移动

django - Tornado 和 Django 的限制?

cookies - 在 Pylons 中处理 cookie 的好方法是什么?