为什么Flask with eventlet阻止对同一请求的多次访问

问题描述 投票:-1回答:1

这里是烧瓶的玩具代码(1.1.1):

import eventlet
eventlet.monkey_patch()

from flask import Flask
import time
from flask_socketio import SocketIO

app = Flask(__name__)
socketio = SocketIO(async_mode='eventlet')
socketio.init_app(app)


@app.route('/dummy_fun1')
def dummy_fun1():
    print("this is dummy_fun1")
    socketio.sleep(10)
    return 'dummy_fun1'


@app.route('/dummy_fun2')
def dummy_fun2():
    print("this is dummy_fun2")
    socketio.sleep(8)
    return 'dummy_fun2'


if __name__ == "__main__":
    socketio.run(app, host='0.0.0.0', port=5566, debug=False)

[启动烧瓶,然后尝试通过2次不同的Chrome访问/ dummy_fun1。

[我发现是/ dummy_fun1的第一次访问阻止了/ dummy_fun1的第二次访问。由于threaded = True,我希望flask可以并行服务相同URL的这两次访问,但事实并非如此。虽然flask确实并行提供2个对不同url的访问,但在这种情况下/ dummy_fun1不会以任何方式阻止/ dummy_fun2。

仍在学习Flask,不太了解Flask为什么如此行事,也许与Flask无关,非常感谢任何建议可以帮助我理解底层逻辑。

更新:

[请保持清晰,因此请摆脱python线程,并利用flask_socketio运行带有eventlet的flask应用程序,并将其设置为asnyc模式,但是它仍然阻止对一个URL的相同访问,并且在不同的URL之间没有阻止。

python flask flask-socketio eventlet
1个回答
-1
投票
不确定time.sleep()是否是阻止您避免有多个请求的调用。尝试对烧瓶请求使用异步:

https://flask-aiohttp.readthedocs.io/en/latest/

© www.soinside.com 2019 - 2024. All rights reserved.