threaded=True
个请求都在新线程中处理。但是,如果我将thread 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中打开了两个标签,并试图在不同的标签中请求相同的网址。只有在提供第一个请求后才会提供第二个请求。第二个请求需要大约20秒才能完成。
我的代码有什么问题?
答案 0 :(得分:5)
关于部署选项
的烧瓶文档虽然重量轻且易于使用,但Flask的内置服务器不适合生产,因为它不能很好地扩展,默认情况下一次只能提供一个请求。这里记录了一些可用于在生产中正确运行Flask的选项。
这就是为什么你的第二个请求在第一个请求完成之前没有发生的原因,因为它自己的烧瓶服务器一次只能处理一个请求。要解决此问题,您需要在某种部署服务器上运行Flask,例如gunicorn或uWSGI,这似乎是最受欢迎的。
您也可能会发现this或this问题的答案有帮助。 Deployment Options还有许多链接指南和有关解决问题的不同方法的信息。
答案 1 :(得分:0)
Python的GIL一次只允许运行1个线程。所以2个请求总共需要20秒。它们是一次运行还是相互交错取决于许多因素,包括操作系统。
答案 2 :(得分:0)
我似乎无法找到我的参考,但我记得从另一篇SO帖子中读到,为什么来自同一浏览器的两个标签在请求形成相同路线时失败,尽管thread = True。
该帖子的要点是,虽然线程将更好地处理与同一个应用程序的多个连接,但浏览器本身将尝试重用任何已打开的连接。因此,通过两个选项卡设置,您可以从不同的路径请求并且它可以正常工作但是如果您从相同的路线请求,则由于浏览器的连接回收而遇到问题。尝试打开两个不同的浏览器并测试它。我再次为没有我的原始参考而道歉,我想给予作者信用。如果我发现它会更新这篇文章。
答案 3 :(得分:-3)
我发现了最棘手的问题! 无论您使用哪种dubug服务器或生产wsgi服务器! 当您尝试多进程或多线程时! 您应该使用其他浏览器或Chrome隐身窗口!!!
解决我所有的问题! 示例代码在这里
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)