Skip to content

Instantly share code, notes, and snippets.

@miracle2k
Forked from denik/ServerRack.py
Created April 22, 2012 12:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save miracle2k/2463996 to your computer and use it in GitHub Desktop.
Save miracle2k/2463996 to your computer and use it in GitHub Desktop.
class for managing multiple servers in gevent
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 add(self, server):
self._servers.append(server)
def start(self):
started = []
self._stop_event.clear()
try:
for server in self._servers:
server.start()
started.append(server)
except:
self.stop(servers=started)
raise
def stop(self, timeout=None, servers=None):
if not servers:
servers = self._servers[:]
self._stop_event.set()
for server in servers:
try:
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)
def stop(self, timeout=None):
self.greenlet.kill()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment