Skip to content

Commit a7f3970

Browse files
author
zeekay
committed
Clean up better after ourselves.
1 parent 3b88cab commit a7f3970

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

flask_uwsgi_websocket/_gevent.py

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from gevent import sleep, spawn, wait
1+
from gevent import killall, sleep, spawn, wait
22
from gevent.event import Event
33
from gevent.queue import Queue
44
from gevent.select import select
@@ -18,6 +18,7 @@ def __init__(self, fd, send_event, send_queue, recv_event, recv_queue, timeout=6
1818
self.recv_event = recv_event
1919
self.recv_queue = recv_queue
2020
self.timeout = timeout
21+
self.connected = True
2122

2223
def send(self, message):
2324
self.send_queue.put(message)
@@ -49,30 +50,44 @@ def __call__(self, environ, start_response):
4950
client = self.client(uwsgi.connection_fd(), send_event, send_queue, recv_event, recv_queue)
5051

5152
# spawn handler
52-
spawn(handler, client)
53+
handler_g = spawn(handler, client)
5354

5455
# spawn recv listener
5556
def listener(client):
5657
ready = select([client.fd], [], [], client.timeout)
5758
recv_event.set()
58-
spawn(listener, client)
59+
listener_g = spawn(listener, client)
5960

6061
while True:
61-
ready = wait([send_event, recv_event], None, 1)
62+
if not client.connected:
63+
recv_queue.put(None)
64+
handler_g.join(client.timeout)
65+
return ''
66+
67+
# wait for event to draw our attention
68+
ready = wait([handler_g, send_event, recv_event], None, 1)
69+
70+
# handle send events
6271
if send_event.is_set():
6372
send_event.clear()
6473
try:
6574
uwsgi.websocket_send(send_queue.get())
66-
except IOError: # client disconnected
67-
pass
75+
except IOError:
76+
client.connected = False
6877

69-
if recv_event.is_set():
78+
# handle receive events
79+
elif recv_event.is_set():
7080
recv_event.clear()
7181
try:
7282
recv_queue.put(uwsgi.websocket_recv_nb())
73-
spawn(listener, client)
74-
except IOError: # client disconnected
75-
pass
83+
listener_g = spawn(listener, client)
84+
except IOError:
85+
client.connected = False
86+
87+
# handler all cleaned up and ready to go
88+
elif handler_g.ready():
89+
listener_g.kill()
90+
return ''
7691

7792

7893
class GeventWebSocket(WebSocket):

0 commit comments

Comments
 (0)