python不工作
当python不工作,python,multithreading,flask,Python,Multithreading,Flask,当threaded=True时请求都在一个新线程中处理。但如果我将threaded设置为true,则应用程序将显示未知行为 这是我的密码 from flask import Flask from flask import jsonify import time app = Flask("proxapp") import datetime @app.route('/slow') def slow(): start = datetime.datetime.now() time.
threaded=True时
请求都在一个新线程中处理。但如果我将threaded设置为true,则应用程序将显示未知行为
这是我的密码
from flask import Flask
from flask import jsonify
import time
app = Flask("proxapp")
import datetime
@app.route('/slow')
def slow():
start = datetime.datetime.now()
time.sleep(10)
return jsonify(start = start, end = datetime.datetime.now())
try:
app.run(threaded=True)
except Exception, e:
print repr(e)
我在windows中打开了两个选项卡,并尝试在不同的选项卡中请求相同的url。第二个请求仅在第一个请求被送达之后才被送达。第二个请求需要约20秒才能送达
我的代码有什么问题?来自有关部署选项的flask文档 虽然Flask的内置服务器轻量级且易于使用,但它不适合生产,因为它不能很好地扩展,并且默认情况下一次只提供一个请求。此处记录了一些可用于在生产中正确运行烧瓶的选项 这就是为什么在第一个请求完成之前,第二个请求不会发生,因为flask服务器一次只能处理一个请求。要解决这个问题,您需要在某种部署服务器上运行Flask,例如,或者在最流行的部署服务器上运行Flask 你也可能会发现这个问题的答案或答案很有帮助。
还有很多关于解决问题的不同方法的指南和信息链接。Python的GIL一次只允许运行一个线程。因此,2个请求总共需要20秒。它们是一次运行一个,还是相互交错,取决于许多因素,包括操作系统。我似乎找不到我的参考,但我记得从另一篇文章中读到,尽管threaded=True,但为什么来自同一浏览器的两个选项卡在请求形成相同路由时失败
这篇文章的要点是,虽然线程可以更好地处理同一应用程序的多个连接,但浏览器本身将尝试重用任何已打开的连接。因此,使用两个选项卡设置,您可以从不同的路由进行请求,但如果您从同一路由进行请求,您将遇到问题,因为浏览器会回收连接。尝试打开两个不同的浏览器并进行测试。我再次为没有我的原始参考而道歉,我想给作者一点信任。如果我发现了,我会更新这篇文章。我发现了最棘手的问题! 无论您使用的是dubug服务器还是生产wsgi服务器! 当您尝试多进程或多线程时! 您应该使用不同的浏览器或Chrome incognito窗口 解决我所有的问题! 这里的示例代码
from flask import Flask
import time
import os
import threading as td
app = Flask(__name__)
#trying http://127.0.0.1:5000/
@app.route('/')
def index():
print('index')
print('pid:', os.getpid())
print('thread id:', td.get_ident())
time.sleep(10)
return "Hello, World!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, threaded=True)
我不知道Flask使用的是哪种线程,但Python一次只能运行一个本地Python线程。由于默认的Flask WSGI只用于开发,我建议从一开始就切换到Gevent或gunicorn,同时也解决了@ForceBru的问题,2020年的人们可能会注意到,这个代码段在10秒内运行了两个线程,非常完美。只需更新旧的py2打印和except声明。您引用的文本表示:“默认情况下,一次只提供一个请求”。OP通过指定
threaded=True
覆盖默认行为。