Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

64 строки
1.8KB

  1. from __future__ import absolute_import
  2. import gevent
  3. from gevent import queue
  4. from gevent.event import Event
  5. try:
  6. import geventwebsocket # noqa
  7. _websocket_available = True
  8. except ImportError:
  9. _websocket_available = False
  10. class Thread(gevent.Greenlet): # pragma: no cover
  11. """
  12. This wrapper class provides gevent Greenlet interface that is compatible
  13. with the standard library's Thread class.
  14. """
  15. def __init__(self, target, args=[], kwargs={}):
  16. super(Thread, self).__init__(target, *args, **kwargs)
  17. def _run(self):
  18. return self.run()
  19. class WebSocketWSGI(object): # pragma: no cover
  20. """
  21. This wrapper class provides a gevent WebSocket interface that is
  22. compatible with eventlet's implementation.
  23. """
  24. def __init__(self, app):
  25. self.app = app
  26. def __call__(self, environ, start_response):
  27. if 'wsgi.websocket' not in environ:
  28. raise RuntimeError('You need to use the gevent-websocket server. '
  29. 'See the Deployment section of the '
  30. 'documentation for more information.')
  31. self._sock = environ['wsgi.websocket']
  32. self.environ = environ
  33. self.version = self._sock.version
  34. self.path = self._sock.path
  35. self.origin = self._sock.origin
  36. self.protocol = self._sock.protocol
  37. return self.app(self)
  38. def close(self):
  39. return self._sock.close()
  40. def send(self, message):
  41. return self._sock.send(message)
  42. def wait(self):
  43. return self._sock.receive()
  44. _async = {
  45. 'thread': Thread,
  46. 'queue': queue.JoinableQueue,
  47. 'queue_empty': queue.Empty,
  48. 'event': Event,
  49. 'websocket': WebSocketWSGI if _websocket_available else None,
  50. 'sleep': gevent.sleep,
  51. }