终结点上的Flask阻止,不允许另一个终结点调用

问题描述 投票:1回答:2

flask API的端点之一向实时流发出了较长的请求。这是代码示例:

@app.route('/stream')
def live_stream(sensor_id):
    stream = requests.get('stream_url', stream=True)
    return Response(stream_with_context(stream.iter_content(chunk_size=2048)),
                content_type=stream.headers['content-type'])

此路线运行正常,流进行顺利。但是,当我尝试向其他路由发出请求时,服务器似乎卡在了此端点。

我正在使用gevent WSGI服务器:

 http_server = WSGIServer(('0.0.0.0', 5000), app).serve_forever()

而且我正在从Flask路由已返回的模板发出请求。

我如何向API发出并行请求而不会陷入困境?

python flask wsgi gevent
2个回答
0
投票

我从未使用过gevent,但如果我理解正确,它会有一个单线程事件循环(如asyncio)。但是我的理解可能是错误的。

看看这个答案https://stackoverflow.com/a/19153826/

[如果您的一段python代码需要很长时间才能运行(几秒钟)并且不会导致切换greenlets,则所有其他greenlets / gevent作业都会“饿死”并且没有计算时间,并且看起来像您的应用程序“挂起”。

我建议执行以下操作之一:

  • 或者,在线程化的WSGI服务器中运行您的Web应用程序
  • 或者研究gevent是否具有可用于代替基于greelet的requests的网络客户端
  • 或者,在线程工具中运行代码的阻塞部分

0
投票

我刚刚尝试使用eventlet wsgi服务器,该服务器允许并发请求,但问题仍然存在。该页面模板不会回复任何其他请求。 enter image description here

我留下快照来解释正在发生的事情。有什么建议吗?在此先感谢

© www.soinside.com 2019 - 2024. All rights reserved.