流,我試圖從燒瓶/ gunicorn服務器數據流:與gunicorn
while (True):
result = json.dumps(tweetQueue.get())
yield result
不過30秒到流,gunicorn超時我的連接並停止流。我怎樣才能使超時發佈到服務器的新的數據流將重新啓動超時,所以流不會被終止?
謝謝!
流,我試圖從燒瓶/ gunicorn服務器數據流:與gunicorn
while (True):
result = json.dumps(tweetQueue.get())
yield result
不過30秒到流,gunicorn超時我的連接並停止流。我怎樣才能使超時發佈到服務器的新的數據流將重新啓動超時,所以流不會被終止?
謝謝!
我在做了一些更多的研究後回答我自己的問題。
gunicorn server:app -k gevent
此使用異步工作人員,其中有服務請求時使用Connection: keep-alive
的好處。這允許請求被無限期地服務。
這個答案聽起來不錯,但不幸的是它並沒有爲我工作。我使用Python 2.7和gunicorn 0.14.5和gevent 0.13.6。你正在使用哪些版本? –
考慮使用內置的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://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,瓶)在virtualenv中,以避免與其他軟件發生衝突。
Gunicorn進程正在向主進程發送「消息」,讓它知道它們還活着(請參閱https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/workertmp.py#L40)。然而,這不會在響應服務期間完成(例如,請參閱https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/sync.py#L160),因此如果需要更長的時間,則主進程超時會導致工作者死亡。
爲了讓您的答案保持活躍,您不僅應該提供鏈接,還應該在答案中提供一些內容,因此如果鏈接消失,它就會在這裏。 – storaged
也許這個'gunicorn'參數是相關的? http://docs.gunicorn.org/en/develop/configure.html#timeout – jaynp
是的,我認爲 - 設置一個很大的超時值似乎很不雅觀,我看不到一種方法來關閉完全超時。 此外,理想情況下,如果連接確實丟失,我仍然會有一個有用的超時時間,但是當新數據發佈時,超時將被重置。 – akn320