应要求烧瓶挂起
Flask Hangs on request
最近我正在为 Windows 服务器开发一个 Flask website/api 应用程序,发现出现了一些奇怪的问题。
当有人向 url 发出请求时,偶尔(大约 10 次中有 3-4 次)它会挂起。要使该请求通过,我需要做的就是转到启动 Flask 服务器的命令行,并发送中断信号。 (我在 windows,所以基本上 "Ctrl + C")。我在谷歌上搜索了一段时间,但我相信 none 的解决方案适用。这是我尝试过的:
- 按照建议在
app.run()
中添加 threaded=true
here 无效。
- 在This link中,作者提到某些浏览器可能会同时触发多个请求并使服务器混乱。这可能不适用于此处,因为我已尝试从 python 的
requests
库发出请求,但仍然看到服务器挂起。
- here 中提到的使用 Gevent 或 Tornado 为应用程序提供服务也不起作用。
- 在 python 3 和 python 2.7 上都试过,有同样的问题。
我在本地计算机(win7 64 位)上的设置几乎相同,一切正常。 (有问题的服务器是 Windows Server 2012)
我很想分享一些代码,但我非常怀疑这会是代码问题,因为它在本地运行得非常好。
有没有人遇到过同样的事情?
在与同事核实后(猜想我应该早点做..),似乎命令行工具本身就是问题...(不敢相信)。将其设置为 运行 作为 Windows 计划任务后,发出了数百个请求并且完全没有遇到任何问题。
这里说的一切都是真的 - 当你以正确的方式将它们组合在一起时;-)
- 如 OP 中所述,您的浏览器可能正在发出多个请求。即这通过 Chrome 发生在我身上,但不是通过 nc (netcat) 或 curl 或 wget 等更简单的方法发生的。
- 也如 OP 中所述 - 您需要多线程烧瓶。
- 但在 OP 中 - 当您添加“线程”选项时,如果您 运行 正在
flask
CLI 工具。
- 所以在接受的答案中,它在您切换到“windows 计划任务”时有效 - 可能是因为您正在 直接 调用脚本,而不是通过
flask
cli 程序 AND 脚本具有 threaded=true
- 当您调用脚本 [=25] 时 仅 适用=]直接(没有flask
CLI)。所以这是 a 正确答案 - 但出于不同的原因。
- 另一种方法是 正确地 使用
flask
CLI 启用线程。这可以通过简单地将 --with-threads
添加到 flash
命令来完成。
总而言之 - 有两种正确的方法:
- 在
app.run()
和 运行 脚本中直接添加 threaded=true
- 将
--with-threads
添加到 flask
CLI 程序并 运行 这样。
最近我正在为 Windows 服务器开发一个 Flask website/api 应用程序,发现出现了一些奇怪的问题。
当有人向 url 发出请求时,偶尔(大约 10 次中有 3-4 次)它会挂起。要使该请求通过,我需要做的就是转到启动 Flask 服务器的命令行,并发送中断信号。 (我在 windows,所以基本上 "Ctrl + C")。我在谷歌上搜索了一段时间,但我相信 none 的解决方案适用。这是我尝试过的:
- 按照建议在
app.run()
中添加threaded=true
here 无效。 - 在This link中,作者提到某些浏览器可能会同时触发多个请求并使服务器混乱。这可能不适用于此处,因为我已尝试从 python 的
requests
库发出请求,但仍然看到服务器挂起。 - here 中提到的使用 Gevent 或 Tornado 为应用程序提供服务也不起作用。
- 在 python 3 和 python 2.7 上都试过,有同样的问题。
我在本地计算机(win7 64 位)上的设置几乎相同,一切正常。 (有问题的服务器是 Windows Server 2012)
我很想分享一些代码,但我非常怀疑这会是代码问题,因为它在本地运行得非常好。
有没有人遇到过同样的事情?
在与同事核实后(猜想我应该早点做..),似乎命令行工具本身就是问题...(不敢相信)。将其设置为 运行 作为 Windows 计划任务后,发出了数百个请求并且完全没有遇到任何问题。
这里说的一切都是真的 - 当你以正确的方式将它们组合在一起时;-)
- 如 OP 中所述,您的浏览器可能正在发出多个请求。即这通过 Chrome 发生在我身上,但不是通过 nc (netcat) 或 curl 或 wget 等更简单的方法发生的。
- 也如 OP 中所述 - 您需要多线程烧瓶。
- 但在 OP 中 - 当您添加“线程”选项时,如果您 运行 正在
flask
CLI 工具。 - 所以在接受的答案中,它在您切换到“windows 计划任务”时有效 - 可能是因为您正在 直接 调用脚本,而不是通过
flask
cli 程序 AND 脚本具有threaded=true
- 当您调用脚本 [=25] 时 仅 适用=]直接(没有flask
CLI)。所以这是 a 正确答案 - 但出于不同的原因。 - 另一种方法是 正确地 使用
flask
CLI 启用线程。这可以通过简单地将--with-threads
添加到flash
命令来完成。
总而言之 - 有两种正确的方法:
- 在
app.run()
和 运行 脚本中直接添加threaded=true
- 将
--with-threads
添加到flask
CLI 程序并 运行 这样。