我使用長輪詢與gevent聊天。我正在使用Event.wait()等待新消息發佈到聊天中。捕獲客戶端斷開事件! - Gevent/Python
我想處理之際客戶端斷開一些功能:
例如返回「客戶端已斷開連接」爲其他聊天用戶
這是可能的消息? =)
我使用長輪詢與gevent聊天。我正在使用Event.wait()等待新消息發佈到聊天中。捕獲客戶端斷開事件! - Gevent/Python
我想處理之際客戶端斷開一些功能:
例如返回「客戶端已斷開連接」爲其他聊天用戶
這是可能的消息? =)
這取決於你使用的WSGI服務器。當客戶端關閉連接時,AFAIK gevent.wsgi不會以任何方式通知您的處理程序,因爲libevent-http不會這樣做。但是,使用gevent.pywsgi應該是可以的。您可能需要啓動一個額外的greenlet來監視套接字條件,並以某種方式通知運行該處理程序的greenlet,例如通過殺死它。我可能會錯過一個更簡單的方法來做到這一點。
這是一個在黑暗中總刺,因爲我從來沒有使用過gevent,但不會客戶端斷開,只是當套接字關閉。所以也許這樣的事情會起作用:
if not Event.wait():
# Client has disconnected, do your magic here!
return Chat({'status': 'client x has disconnected'})
你可能用這把刺擊了一個忍者,讓我檢查! = D謝謝你! – RadiantHex 2010-07-26 13:12:13
按照WSGI PEP,如果您的應用程序返回一個迭代用close()方法,服務器應該調用在請求結束。這裏有一個例子:
"""
Run this script with 'python sleepy_app.py'. Then try connecting to the server
with curl:
curl -N http://localhost:8000/
You should see a counter printed in your terminal, incrementing once every
second.
Hit Ctrl-C on the curl window to disconnect the client. Then watch the
server's output. If running with a WSGI-compliant server, you should see
"SLEEPY CONNECTION CLOSE" printed to the terminal.
"""
class SleepyApp(object):
def __init__(self, environ, start_response):
self.environ = environ
self.start_response = start_response
def __iter__(self):
self.start_response('200 OK', [('Content-type', 'text/plain')])
# print out one number every 10 seconds.
import time # imported late for easier gevent patching
counter = 0
while True:
print "SLEEPY", counter
yield str(counter) + '\n'
counter += 1
time.sleep(1)
def close(self):
print "SLEEPY CONNECTION CLOSE"
def run_gevent():
from gevent.monkey import patch_all
patch_all()
from gevent.pywsgi import WSGIServer
server = WSGIServer(('0.0.0.0', 8000), SleepyApp)
print "Server running on port 0.0.0.0:8000. Ctrl+C to quit"
server.serve_forever()
if __name__ == '__main__':
run_gevent()
然而,有a bug在Python的執行的wsgiref(以及從它繼承了Django的開發服務器),防止關閉()被調用上中游客戶端斷開連接。所以在這種情況下避免使用wsgiref和Django開發服務器。
還要注意,當客戶端斷開連接時close()不會立即被觸發。當您嘗試向客戶端寫入一些消息並因爲連接不再存在而失敗時,會發生這種情況。
非常感謝您的想法,我非常感謝。這是我真的很想知道的東西! =)#freenode在freenode這些天似乎很沉默...感謝您的回覆denis! – RadiantHex 2010-07-26 21:56:13
我想知道,如果客戶端已斷開連接,異步地在WSGI應用程序中引發一些異常,這會是一個糟糕的主意嗎? – 2010-08-01 19:56:32