简单的flask/gevent请求没有并发运行

4 投票
1 回答
1730 浏览
提问于 2025-04-17 16:33

我有一段简单的flask/gevent示例代码。

#!/usr/bin/env python
import gevent
from gevent.pywsgi import WSGIServer
from gevent import monkey
monkey.patch_socket()

from flask import Flask, Response

app = Flask(__name__)

@app.route('/')
def stream():
    def gen():
        for i in range(10):
            yield "data: %d\r\n" % i
            gevent.sleep(1)
    return Response(gen())

if __name__ == '__main__':
    http = WSGIServer(('', 5000), app)
    http.serve_forever()

当我运行这段代码并在浏览器中打开多个网址时,除了一个以外的所有网址都被阻塞了。我哪里做错了呢?

我试过用monkey.patch_all()来运行它,也试过用 gunicorn streaming:app -k gevent 来运行,但在浏览器中还是会被阻塞。

1 个回答

4

在浏览器中打开多个标签页时,可能会出现阻塞的情况。这并不意味着gevent/gunicorn没有同时处理请求。我用并发的curl请求和XmlHttpRequest测试过,结果都很正常。另外要注意,curl会缓存输出,想要逐行打印内容,需要加上"\r\n"。

顺便提一下,感谢mitsuhiko在#pocoo的帮助。如果你还没试过flask,建议你试试。mitsuhiko和flask都非常棒。

撰写回答