Python 喷泉

Python 喷泉,python,timeout,flask,streaming,gunicorn,Python,Timeout,Flask,Streaming,Gunicorn,我正在尝试从flask/gunicorn服务器流式传输数据: while (True): result = json.dumps(tweetQueue.get()) yield result 然而,进入流30秒后,gunicorn超时我的连接并停止流。如何设置超时,以便从服务器向流发布新数据将重新启动超时,从而流不会终止 谢谢 在做了更多的研究之后,我在回答我自己的问题 gunicorn server:app -k gevent 这将使用异步工作线程,这有助于在服务请求时使用

我正在尝试从flask/gunicorn服务器流式传输数据:

while (True):
    result = json.dumps(tweetQueue.get())
    yield result
然而,进入流30秒后,gunicorn超时我的连接并停止流。如何设置超时,以便从服务器向流发布新数据将重新启动超时,从而流不会终止


谢谢

在做了更多的研究之后,我在回答我自己的问题

gunicorn server:app -k gevent

这将使用异步工作线程,这有助于在服务请求时使用
Connection:keep-alive
。这允许无限期地提供请求。

考虑使用内置的
BaseHTTPServer
而不是gunicorn。以下示例在同一端口上启动100个处理程序线程,每个处理程序通过
BaseHTTPServer
启动。它可以很好地进行数据流传输,在一个端口上支持多个连接,并且通常运行速度比gunicorn快2倍。如果你想的话,你也可以用SSL封装你的套接字

import time, threading, socket, SocketServer, BaseHTTPServer

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        if self.path != '/':
            self.send_error(404, "Object not found")
            return
        self.send_response(200)
        self.send_header('Content-type', 'text/html; charset=utf-8')
        self.end_headers()

        # serve up an infinite stream
        i = 0
        while True:
            self.wfile.write("%i " % i)
            time.sleep(0.1)
            i += 1

# Create ONE socket.
addr = ('', 8000)
sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(addr)
sock.listen(5)

# Launch 100 listener threads.
class Thread(threading.Thread):
    def __init__(self, i):
        threading.Thread.__init__(self)
        self.i = i
        self.daemon = True
        self.start()
    def run(self):
        httpd = BaseHTTPServer.HTTPServer(addr, Handler, False)

        # Prevent the HTTP server from re-binding every handler.
        # https://stackoverflow.com/questions/46210672/
        httpd.socket = sock
        httpd.server_bind = self.server_close = lambda self: None

        httpd.serve_forever()
[Thread(i) for i in range(100)]
time.sleep(9e9)

如果您仍然坚持使用gunicorn,请记住将其(及其所有相关包:wsgi、gevent、flask)放入virtualenv中,以避免与其他软件发生冲突。

gunicorn进程正在向主进程发送“消息”,让主进程知道它们仍然处于活动状态(请参阅)。但是,在响应服务期间不会执行此操作(例如,请参阅),因此,如果超时时间超过超时时间,则主进程会杀死工作进程。

也许此
gunicorn
参数相关?是的,我考虑过这一点——仅仅设置一个大的超时值似乎真的很不雅观,而且我找不到完全关闭超时的方法。此外,理想情况下,如果连接真的丢失,我仍然会有一个有用的超时,但是当发布新数据时,超时会被重置。这个答案听起来不错,但不幸的是,它对我不起作用。我使用的是Python 2.7、gunicorn 0.14.5和gevent 0.13.6。您使用的是哪个版本?与上面的评论不同,这种方法仍然有效。但在尝试此操作之前,请记住安装
gevent
。作为参考,首先使用
pip install greenlet
安装greenlet,然后使用
pip install GEvent
安装GEvent。为了使您的答案保持活力,您不仅应该提供链接,还应该在答案中添加一些内容,这样,如果链接消失,就会出现在这里。@Hejazzmann。BaseHTTPServer启动和运行速度更快,而且更安全,因为它是一个更好的实现,bug更少。gunicorn会腐败,并且有多个包依赖关系,当人们认为“virtualenv是不相关的”而只是
pip
时,会在大型项目中导致bug。你选吧,但请不要选。你不知道你在说什么。BaseHTTPServer是Web服务器构造的基类。不适用于生产,因为它缺乏安全性/性能特性。甚至不建议使用更高级别的SimpleHTTPServer:“此模块定义了两个用于实现HTTP服务器(Web服务器)的类。通常,此模块不直接使用,而是用作构建正常运行的Web服务器的基础。请参阅SimpleHTTPServer和CGIHTTPServer模块。”(…)“警告SimpleHTTPServer不建议用于生产。它只实现基本的安全检查。”(python文档)