Skip to content

Instantly share code, notes, and snippets.

@miracle2k
Forked from denik/ServerRack.py
Created April 22, 2012 12:47
Show Gist options
  • Select an option

  • Save miracle2k/2463996 to your computer and use it in GitHub Desktop.

Select an option

Save miracle2k/2463996 to your computer and use it in GitHub Desktop.

Revisions

  1. Michael Elsdörfer revised this gist Apr 22, 2012. 1 changed file with 39 additions and 16 deletions.
    55 changes: 39 additions & 16 deletions ServerRack.py
    Original file line number Diff line number Diff line change
    @@ -1,37 +1,60 @@
    # Class for managing multiple servers or anything with start() and stop() methods

    class ServerRack(object):
    """Manages multiple gevent Servers. Works with anything that has
    start() and stop() methods.
    Adapted from:
    https://gist.github.com/1008826
    """

    def __init__(self):
    self._servers = []
    self._stop_event = gevent.event.Event()
    self._stop_event.set()

    def __init__(self, servers):
    self.servers = servers
    def add(self, server):
    self._servers.append(server)

    def start(self):
    started = []
    self._stop_event.clear()
    try:
    for server in self.servers[:]:
    for server in self._servers:
    server.start()
    started.append(server)
    name = getattr(server, 'name', None) or server.__class__.__name__ or 'Server'
    log('%s started on %s', name, server.address)
    except:
    self.stop(started)
    self.stop(servers=started)
    raise

    def stop(self, servers=None):
    if servers is None:
    servers = self.servers[:]
    def stop(self, timeout=None, servers=None):
    if not servers:
    servers = self._servers[:]
    self._stop_event.set()
    for server in servers:
    try:
    server.stop()
    server.stop(timeout=timeout)
    except:
    if hasattr(server, 'loop'): # gevent >= 1.0
    server.loop.handle_error(server.stop, *sys.exc_info())
    else: # gevent <= 0.13
    import traceback
    traceback.print_exc()

    def serve_forever(self, stop_timeout=None):
    self.start()
    try:
    self._stop_event.wait()
    finally:
    gevent.spawn(self.stop, timeout=stop_timeout).join()


    class GreenletService(object):

    def __init__(self, func, args=None, kwargs=None, spawn=None):
    self.func, self.args, self.kwargs = func, args or (), kwargs or {}
    self.spawn = spawn or gevent.spawn

    def start(self):
    self.greenlet = self.spawn(self.func, *self.args, **self.kwargs)

    # example: run WSGI app on HTTP and HTTPS
    rack = ServerRack([WSGIServer(('', 80), application)),
    WSGIServer(('', 443), application, keyfile=keyfile, certfile=certfile])
    rack.start()
    def stop(self, timeout=None):
    self.greenlet.kill()
  2. @denik denik revised this gist Jul 14, 2011. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion ServerRack.py
    Original file line number Diff line number Diff line change
    @@ -24,7 +24,7 @@ def stop(self, servers=None):
    try:
    server.stop()
    except:
    if hasattr(server, 'loop'): gevent >= 1.0
    if hasattr(server, 'loop'): # gevent >= 1.0
    server.loop.handle_error(server.stop, *sys.exc_info())
    else: # gevent <= 0.13
    import traceback
  3. @invalid-email-address Anonymous revised this gist Jun 5, 2011. 1 changed file with 7 additions and 1 deletion.
    8 changes: 7 additions & 1 deletion ServerRack.py
    Original file line number Diff line number Diff line change
    @@ -28,4 +28,10 @@ def stop(self, servers=None):
    server.loop.handle_error(server.stop, *sys.exc_info())
    else: # gevent <= 0.13
    import traceback
    traceback.print_exc()
    traceback.print_exc()


    # example: run WSGI app on HTTP and HTTPS
    rack = ServerRack([WSGIServer(('', 80), application)),
    WSGIServer(('', 443), application, keyfile=keyfile, certfile=certfile])
    rack.start()
  4. @invalid-email-address Anonymous created this gist Jun 5, 2011.
    31 changes: 31 additions & 0 deletions ServerRack.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    # Class for managing multiple servers or anything with start() and stop() methods

    class ServerRack(object):

    def __init__(self, servers):
    self.servers = servers

    def start(self):
    started = []
    try:
    for server in self.servers[:]:
    server.start()
    started.append(server)
    name = getattr(server, 'name', None) or server.__class__.__name__ or 'Server'
    log('%s started on %s', name, server.address)
    except:
    self.stop(started)
    raise

    def stop(self, servers=None):
    if servers is None:
    servers = self.servers[:]
    for server in servers:
    try:
    server.stop()
    except:
    if hasattr(server, 'loop'): gevent >= 1.0
    server.loop.handle_error(server.stop, *sys.exc_info())
    else: # gevent <= 0.13
    import traceback
    traceback.print_exc()