Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python不工作_Python_Multithreading_Flask - Fatal编程技术网

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
覆盖默认行为。