class AsyncGeventWSGIServer(object):
""" Runs gevent's WSGIServer in its own greenlet """
def __init__(self, listener, application=None, backlog=None, **kwargs):
"""
Same args/kwargs as gevent.pywsgi.WSGIServer constructor
If listener arg is None, creates a listener socket with hostname of
socket.gethostname(), and forces port auto-binding, such that subsequent
call to getListenerAddress() will return a valid address/port pair.
"""
if listener is None:
listener = gevent_socket.socket()
listener.bind((gevent_socket.gethostname(), 0))
listener.listen(backlog or WSGIServer.backlog)
listener.setblocking(0)
self._wsgi = WSGIServer(listener, application, backlog, **kwargs)
self._wsgiGreenlet = gevent.spawn(self._wsgi.serve_forever, stop_timeout=20)
geventhelpers.linkException(self._wsgiGreenlet)
return
def close(self):
""" Shut down the server """
gevent.sleep()
self._wsgi.stop(timeout=20)
self._wsgiGreenlet.join(timeout=20)
geventhelpers.unlinkException(self._wsgiGreenlet)
return