You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.7 KiB
54 lines
1.7 KiB
from __future__ import absolute_import |
|
|
|
from eventlet.green.threading import Event |
|
from eventlet import queue, sleep, spawn |
|
from eventlet.websocket import WebSocketWSGI as _WebSocketWSGI |
|
|
|
|
|
class EventletThread: # pragma: no cover |
|
"""Thread class that uses eventlet green threads. |
|
|
|
Eventlet's own Thread class has a strange bug that causes _DummyThread |
|
objects to be created and leaked, since they are never garbage collected. |
|
""" |
|
def __init__(self, target, args=None, kwargs=None): |
|
self.target = target |
|
self.args = args or () |
|
self.kwargs = kwargs or {} |
|
self.g = None |
|
|
|
def start(self): |
|
self.g = spawn(self.target, *self.args, **self.kwargs) |
|
|
|
def join(self): |
|
if self.g: |
|
return self.g.wait() |
|
|
|
|
|
class WebSocketWSGI(_WebSocketWSGI): |
|
def __init__(self, handler, server): |
|
try: |
|
super().__init__( |
|
handler, max_frame_length=int(server.max_http_buffer_size)) |
|
except TypeError: # pragma: no cover |
|
# older versions of eventlet do not support a max frame size |
|
super().__init__(handler) |
|
self._sock = None |
|
|
|
def __call__(self, environ, start_response): |
|
if 'eventlet.input' not in environ: |
|
raise RuntimeError('You need to use the eventlet server. ' |
|
'See the Deployment section of the ' |
|
'documentation for more information.') |
|
self._sock = environ['eventlet.input'].get_socket() |
|
return super().__call__(environ, start_response) |
|
|
|
|
|
_async = { |
|
'thread': EventletThread, |
|
'queue': queue.Queue, |
|
'queue_empty': queue.Empty, |
|
'event': Event, |
|
'websocket': WebSocketWSGI, |
|
'sleep': sleep, |
|
}
|
|
|