Skip to content

Commit 4b9944f

Browse files
author
zeekay
committed
Simple send/receive API for GeventWebsocket.
1 parent acac8ed commit 4b9944f

File tree

1 file changed

+29
-25
lines changed

1 file changed

+29
-25
lines changed

flask_uwsgi_websocket/_gevent.py

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22
from gevent.event import Event
33
from gevent.queue import Queue
44
from gevent.select import select
5+
from gevent.monkey import patch_all; patch_all()
56
import uuid
67

78
from . import WebSocket, WebSocketClient, WebSocketMiddleware
89
from ._uwsgi import uwsgi
910

1011

1112
class GeventWebSocketClient(object):
12-
def __init__(self, send_event, send_queue, recv_event, recv_queue, timeout=60):
13+
def __init__(self, fd, send_event, send_queue, recv_event, recv_queue, timeout=60):
1314
self.id = str(uuid.uuid1())
15+
self.fd = fd
1416
self.send_event = send_event
1517
self.send_queue = send_queue
1618
self.recv_event = recv_event
@@ -20,12 +22,10 @@ def __init__(self, send_event, send_queue, recv_event, recv_queue, timeout=60):
2022
def send(self, message):
2123
self.send_queue.put(message)
2224
self.send_event.set()
23-
self.send_event.clear()
2425

2526
def receive(self):
2627
self.recv_event.set()
27-
self.recv_event.clear()
28-
self.recv_queue.get()
28+
return self.recv_queue.get()
2929

3030

3131
class GeventWebSocketMiddleware(WebSocketMiddleware):
@@ -40,37 +40,41 @@ def __call__(self, environ, start_response):
4040
# do handshake
4141
uwsgi.websocket_handshake(environ['HTTP_SEC_WEBSOCKET_KEY'], environ.get('HTTP_ORIGIN', ''))
4242

43+
# setup events
4344
send_event = Event()
4445
send_queue = Queue()
4546

4647
recv_event = Event()
4748
recv_queue = Queue()
4849

49-
client = self.client(send_event, send_queue, recv_event, recv_queue)
50+
client = self.client(uwsgi.connection_fd(), send_event, send_queue, recv_event, recv_queue)
5051

51-
fd = uwsgi.connection_fd()
52+
# spawn handler
53+
spawn(handler, client)
5254

53-
def send():
54-
ready.set()
55-
message = send_queue.get()
56-
uwsgi.websocket_send(message)
57-
send_event.rawlink(send)
58-
59-
def listen():
60-
ready.set()
61-
select([fd], [], [], client.timeout)
62-
try:
63-
recv_queue.put(uwsgi.websocket_recv_nb())
64-
except IOError: # client disconnected
65-
pass
66-
recv_event.rawlink(listen)
67-
68-
ready = Event()
55+
# spawn recv listener
56+
def listener(client):
57+
ready = select([client.fd], [], [], client.timeout)
58+
recv_event.set()
59+
spawn(listener, client)
6960

7061
while True:
71-
ready.clear()
72-
ready.wait()
73-
62+
if send_event.is_set():
63+
send_event.clear()
64+
try:
65+
uwsgi.websocket_send(send_queue.get())
66+
except IOError: # client disconnected
67+
pass
68+
69+
if recv_event.is_set():
70+
recv_event.clear()
71+
try:
72+
recv_queue.put(uwsgi.websocket_recv_nb())
73+
spawn(listener, client)
74+
except IOError: # client disconnected
75+
pass
76+
77+
sleep(0.1)
7478

7579
class GeventWebSocket(WebSocket):
7680
middleware = GeventWebSocketMiddleware

0 commit comments

Comments
 (0)