Python heroku上的Flask Streaming仍会出现30秒超时错误

Python heroku上的Flask Streaming仍会出现30秒超时错误,python,heroku,flask,Python,Heroku,Flask,我正在学习Flask,并试图在Heroku上创建一个小网站。 我在Heroku上部署长任务时出现超时错误,可以通过超时增加来绕过。经过进一步调查,我发现另一个解决方案是流化。下面是一篇与我的解决方案相关的文章: 但这不是工作。30秒后仍会出现错误 文章中的代码: from flask import Flask, Response import requests app = Flask(__name__) def some_long_calculation(number): ''' h

我正在学习Flask,并试图在Heroku上创建一个小网站。 我在Heroku上部署长任务时出现超时错误,可以通过超时增加来绕过。经过进一步调查,我发现另一个解决方案是流化。下面是一篇与我的解决方案相关的文章: 但这不是工作。30秒后仍会出现错误 文章中的代码:

from flask import Flask, Response
import requests

app = Flask(__name__)

def some_long_calculation(number):
  '''
  here will be some long calculation using this number
  let's simulate that using sleep for now :)
  '''
  import time
  time.sleep(5)

  return number

@app.route('/')
def check():
    def generate():
      for i in range(10):
        yield "<br/>"   # notice that we are yielding something as soon as possible
        yield str(some_long_calculation(i))
    return Response(generate(), mimetype='text/html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)
来自烧瓶导入烧瓶,响应
导入请求
app=烧瓶(名称)
定义一些长的计算(数字):
'''
这里将使用这个数字进行一些长时间的计算
现在让我们模拟一下使用睡眠:)
'''
导入时间
时间。睡眠(5)
返回号码
@应用程序路径(“/”)
def check():
def generate():
对于范围(10)内的i:
收益率“
”#请注意,我们正在尽快做出一些让步 收益率str(一些长期计算(i)) 返回响应(generate(),mimetype='text/html') 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 运行(主机=0.0.0.0',端口=8080,调试=True)

你知道这个问题吗?

编辑:我最初是在2016年回答这个问题的,当时下面的信息是真实的。今天,使用流式响应确实可以超过30秒的超时时间

您无法绕过Heroku上请求-响应周期的30秒超时行为。这是通过Heroku布线网格强制执行的

如果您需要像这样发出长时间运行的请求,您有几个选项:

  • 将大数据放入S3或其他文件存储服务上的文件中。当人们提出请求时,向他们发送文件URL,并让他们在那里下载。(这是最理想的)
  • 使用。根据定义,Web套接字是浏览器和服务器之间永远不会关闭的持久TCP连接。这非常适合于需要连续往返和第四次通信的应用程序,如您所描述的

  • 您可以通过使用流式响应来避免heroku的30秒限制,我刚刚确认它正在工作


    我在heroku中使用的是flask w/gunicorn,除了链接的示例代码之外,我还需要更改gunicorn超时设置:web:gunicorn“app.app:create_app()”——在我的例子中是timeout 600。默认超时时间为30秒,这恰好与heroku的超时设置相同。

    也许这篇文章会有所帮助:谢谢Leeh先生,我会检查一下,但解决方案似乎是创建新任务并在后台运行,而不是将数据流到web浏览器。我正在寻找数据流的解决方案,比如更新进度,可以绕过Herokurdegges的30秒超时,感谢他给出了清晰的答案,并阻止我搜索不存在的答案。我已经很晚了,但这不是真的。通过流式响应,您可以达到大约30秒的请求超时限制。更新,就在不久前,我的答案已经过时。自2016年我写下这个答案以来,情况发生了变化。不知何故,我无法编辑我的答案,所以将此评论留在这里以帮助新读者。