Skip to content

Instantly share code, notes, and snippets.

@quark-zju
Last active May 12, 2016 23:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save quark-zju/015c448b548bc6fbad4105868e2028ac to your computer and use it in GitHub Desktop.
Save quark-zju/015c448b548bc6fbad4105868e2028ac to your computer and use it in GitHub Desktop.
#! /usr/bin/env python3
# quick & dirty preforked echo server listening on /tmp/server
# client: socat unix-connect:/tmp/server stdout
import os, sys, time, signal, socketserver
class WorkerServer(socketserver.UnixStreamServer):
def __init__(self, server_address, RequestHandlerClass, socket):
print('worker created: %s' % (os.getpid(), ))
socketserver.BaseServer.__init__(self, server_address, RequestHandlerClass)
self.socket = socket
class MasterServer(socketserver.UnixStreamServer):
max_nchildren = 5
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
socketserver.UnixStreamServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate)
self.children = set()
signal.signal(signal.SIGCHLD, self.reap_workers)
def serve_forever(self, interval=0.5):
while self.running():
self.create_workers()
self.reap_workers()
time.sleep(interval)
def running(self):
return not os.path.exists('/tmp/exit')
def create_worker(self):
pid = os.fork()
assert pid >= 0
if pid == 0:
try:
worker = WorkerServer(self.server_address, self.RequestHandlerClass, self.socket)
worker.serve_forever()
except Exception as ex:
print(ex)
finally:
sys.exit(0)
else:
self.children.add(pid)
def create_workers(self, interval=0.5):
while len(self.children) < self.max_nchildren:
self.create_worker()
time.sleep(interval)
def reap_workers(self, *args):
for pid in self.children.copy():
try:
pid, _ = os.waitpid(pid, os.WNOHANG)
self.children.discard(pid)
except ChildProcessError:
self.children.discard(pid)
except OSError:
pass
class myhandler(socketserver.StreamRequestHandler):
def handle(self):
print('serving %s from pid %s' % (self.client_address, os.getpid()))
while 1:
data = self.rfile.read(1)
if not data:
break
self.wfile.write(data)
if os.path.exists('/tmp/server'):
os.unlink('/tmp/server')
server = MasterServer('/tmp/server', myhandler)
server.serve_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment