我正在尝试从一个Flask/Gunicorn服务器流式传输数据:
while (True):
result = json.dumps(tweetQueue.get())
yield result
然而,在流进行了30秒后,gunicorn会超时并停止流。我该如何设置超时时间,以便从服务器向流中发布新数据将重新启动超时,使流不会终止?
谢谢!
在做了进一步的研究后,我会回答自己的问题。
gunicorn server:app -k gevent
这里使用了异步工作者,其优点是在响应请求时使用 Connection: keep-alive
。这允许请求无限期地被服务。
gevent
。作为参考,首先使用 pip install greenlet
安装 greenlet,然后再使用 pip install gevent
安装 GEvent。 - B8vredeGunicorn 进程向主进程发送 "消息",以让它知道它们仍然存活着(请参见https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/workertmp.py#L40)。但是,在响应服务期间不会执行此操作(例如,请参见https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/sync.py#L160),因此,如果超时时间超过了规定的时间,则主进程将终止该工作进程。
BaseHTTPServer
而不是gunicorn。以下示例在同一端口上启动100个处理程序线程,每个处理程序通过BaseHTTPServer
启动。它可以流畅地运行,支持1个端口上的多个连接,并且通常比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://dev59.com/nlYO5IYBdhLWcg3wL-vY
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
参数是相关的?http://docs.gunicorn.org/en/develop/configure.html#timeout - jaynp