Skip to content

Commit 3f7b14b

Browse files
committed
Make gevent and gevent_uswgi async drivers compatible with threading.Thread interface
1 parent 38c90ed commit 3f7b14b

3 files changed

Lines changed: 21 additions & 31 deletions

File tree

src/engineio/async_drivers/gevent.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,14 @@
33
import gevent
44
from gevent import queue
55
from gevent.event import Event
6+
from gevent.threading import Thread
67
try:
78
import geventwebsocket # noqa
89
_websocket_available = True
910
except ImportError:
1011
_websocket_available = False
1112

1213

13-
class Thread(gevent.Greenlet): # pragma: no cover
14-
"""
15-
This wrapper class provides gevent Greenlet interface that is compatible
16-
with the standard library's Thread class.
17-
"""
18-
def __init__(self, target, args=[], kwargs={}):
19-
super(Thread, self).__init__(target, *args, **kwargs)
20-
21-
def _run(self):
22-
return self.run()
23-
24-
2514
class WebSocketWSGI(object): # pragma: no cover
2615
"""
2716
This wrapper class provides a gevent WebSocket interface that is

src/engineio/async_drivers/gevent_uwsgi.py

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,11 @@
11
import gevent
22
from gevent import queue
33
from gevent.event import Event
4+
from gevent.threading import Thread
45
from gevent import selectors
56
import uwsgi
67
_websocket_available = hasattr(uwsgi, 'websocket_handshake')
78

8-
9-
class Thread(gevent.Greenlet): # pragma: no cover
10-
"""
11-
This wrapper class provides gevent Greenlet interface that is compatible
12-
with the standard library's Thread class.
13-
"""
14-
def __init__(self, target, args=[], kwargs={}):
15-
super(Thread, self).__init__(target, *args, **kwargs)
16-
17-
def _run(self):
18-
return self.run()
19-
20-
219
class uWSGIWebSocket(object): # pragma: no cover
2210
"""
2311
This wrapper class provides a uWSGI WebSocket interface that is

tests/common/test_server.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,20 +144,23 @@ def test_async_mode_gevent_uwsgi(self, import_module):
144144
sys.modules['gevent.queue'].Empty = RuntimeError
145145
sys.modules['gevent.event'] = mock.MagicMock()
146146
sys.modules['gevent.event'].Event = 'bar'
147+
sys.modules['gevent.threading'] = mock.MagicMock()
148+
sys.modules['gevent.threading'].Thread = 'baz'
147149
sys.modules['uwsgi'] = mock.MagicMock()
148150
s = server.Server(async_mode='gevent_uwsgi')
149151
assert s.async_mode == 'gevent_uwsgi'
150152

151153
from engineio.async_drivers import gevent_uwsgi as async_gevent_uwsgi
152154

153-
assert s._async['thread'] == async_gevent_uwsgi.Thread
155+
assert s._async['thread'] == 'baz'
154156
assert s._async['queue'] == 'foo'
155157
assert s._async['queue_empty'] == RuntimeError
156158
assert s._async['event'] == 'bar'
157159
assert s._async['websocket'] == async_gevent_uwsgi.uWSGIWebSocket
158160
del sys.modules['gevent']
159161
del sys.modules['gevent.queue']
160162
del sys.modules['gevent.event']
163+
del sys.modules['gevent.threading']
161164
del sys.modules['uwsgi']
162165
del sys.modules['engineio.async_drivers.gevent_uwsgi']
163166

@@ -170,12 +173,15 @@ def test_async_mode_gevent_uwsgi_without_uwsgi(self, import_module):
170173
sys.modules['gevent.queue'].Empty = RuntimeError
171174
sys.modules['gevent.event'] = mock.MagicMock()
172175
sys.modules['gevent.event'].Event = 'bar'
176+
sys.modules['gevent.threading'] = mock.MagicMock()
177+
sys.modules['gevent.threading'].Thread = 'baz'
173178
sys.modules['uwsgi'] = None
174179
with pytest.raises(ValueError):
175180
server.Server(async_mode='gevent_uwsgi')
176181
del sys.modules['gevent']
177182
del sys.modules['gevent.queue']
178183
del sys.modules['gevent.event']
184+
del sys.modules['gevent.threading']
179185
del sys.modules['uwsgi']
180186

181187
@mock.patch('importlib.import_module', side_effect=_mock_import)
@@ -187,21 +193,22 @@ def test_async_mode_gevent_uwsgi_without_websocket(self, import_module):
187193
sys.modules['gevent.queue'].Empty = RuntimeError
188194
sys.modules['gevent.event'] = mock.MagicMock()
189195
sys.modules['gevent.event'].Event = 'bar'
196+
sys.modules['gevent.threading'] = mock.MagicMock()
197+
sys.modules['gevent.threading'].Thread = 'baz'
190198
sys.modules['uwsgi'] = mock.MagicMock()
191199
del sys.modules['uwsgi'].websocket_handshake
192200
s = server.Server(async_mode='gevent_uwsgi')
193201
assert s.async_mode == 'gevent_uwsgi'
194202

195-
from engineio.async_drivers import gevent_uwsgi as async_gevent_uwsgi
196-
197-
assert s._async['thread'] == async_gevent_uwsgi.Thread
203+
assert s._async['thread'] == 'baz'
198204
assert s._async['queue'] == 'foo'
199205
assert s._async['queue_empty'] == RuntimeError
200206
assert s._async['event'] == 'bar'
201207
assert s._async['websocket'] is None
202208
del sys.modules['gevent']
203209
del sys.modules['gevent.queue']
204210
del sys.modules['gevent.event']
211+
del sys.modules['gevent.threading']
205212
del sys.modules['uwsgi']
206213
del sys.modules['engineio.async_drivers.gevent_uwsgi']
207214

@@ -214,20 +221,23 @@ def test_async_mode_gevent(self, import_module):
214221
sys.modules['gevent.queue'].Empty = RuntimeError
215222
sys.modules['gevent.event'] = mock.MagicMock()
216223
sys.modules['gevent.event'].Event = 'bar'
224+
sys.modules['gevent.threading'] = mock.MagicMock()
225+
sys.modules['gevent.threading'].Thread = 'baz'
217226
sys.modules['geventwebsocket'] = 'geventwebsocket'
218227
s = server.Server(async_mode='gevent')
219228
assert s.async_mode == 'gevent'
220229

221230
from engineio.async_drivers import gevent as async_gevent
222231

223-
assert s._async['thread'] == async_gevent.Thread
232+
assert s._async['thread'] == 'baz'
224233
assert s._async['queue'] == 'foo'
225234
assert s._async['queue_empty'] == RuntimeError
226235
assert s._async['event'] == 'bar'
227236
assert s._async['websocket'] == async_gevent.WebSocketWSGI
228237
del sys.modules['gevent']
229238
del sys.modules['gevent.queue']
230239
del sys.modules['gevent.event']
240+
del sys.modules['gevent.threading']
231241
del sys.modules['geventwebsocket']
232242
del sys.modules['engineio.async_drivers.gevent']
233243

@@ -240,20 +250,23 @@ def test_async_mode_gevent_without_websocket(self, import_module):
240250
sys.modules['gevent.queue'].Empty = RuntimeError
241251
sys.modules['gevent.event'] = mock.MagicMock()
242252
sys.modules['gevent.event'].Event = 'bar'
253+
sys.modules['gevent.threading'] = mock.MagicMock()
254+
sys.modules['gevent.threading'].Thread = 'baz'
243255
sys.modules['geventwebsocket'] = None
244256
s = server.Server(async_mode='gevent')
245257
assert s.async_mode == 'gevent'
246258

247259
from engineio.async_drivers import gevent as async_gevent
248260

249-
assert s._async['thread'] == async_gevent.Thread
261+
assert s._async['thread'] == 'baz'
250262
assert s._async['queue'] == 'foo'
251263
assert s._async['queue_empty'] == RuntimeError
252264
assert s._async['event'] == 'bar'
253265
assert s._async['websocket'] is None
254266
del sys.modules['gevent']
255267
del sys.modules['gevent.queue']
256268
del sys.modules['gevent.event']
269+
del sys.modules['gevent.threading']
257270
del sys.modules['geventwebsocket']
258271
del sys.modules['engineio.async_drivers.gevent']
259272

0 commit comments

Comments
 (0)