From cb0be6d45484cb0e413b6df20bea680b78f862f1 Mon Sep 17 00:00:00 2001 From: Benoit Chesneau Date: Tue, 16 Feb 2010 10:19:15 +0100 Subject: [PATCH] add after/before fork hooks --- gunicorn/arbiter.py | 3 +++ gunicorn/config.py | 8 ++++---- gunicorn/worker.py | 6 +++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index 9e6c2871..5f457b49 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -50,6 +50,7 @@ class Arbiter(object): self.debug = kwargs.get("debug", False) self.log = logging.getLogger(__name__) self.opts = kwargs + self.conf = kwargs.get("config", {}) self._pidfile = None self.master_name = "Master" @@ -324,6 +325,7 @@ class Arbiter(object): worker = Worker(i, self.pid, self.LISTENER, self.modname, self.timeout/2.0, self.debug) + self.conf.before_fork(self, worker) pid = os.fork() if pid != 0: self.WORKERS[pid] = worker @@ -333,6 +335,7 @@ class Arbiter(object): worker_pid = os.getpid() try: self.log.info("Worker %s booting" % worker_pid) + self.conf.after_fork(self, worker) worker.run() sys.exit(0) except SystemExit: diff --git a/gunicorn/config.py b/gunicorn/config.py index e9ef2bf0..0e4583e8 100644 --- a/gunicorn/config.py +++ b/gunicorn/config.py @@ -22,10 +22,10 @@ class Config(object): user=None, group=None, - after_fork= lambda server, worker: server.logger.info( - "worker=%s spawned pid=%s}" % (worker.id, worker.pid)), + after_fork= lambda server, worker: server.log.info( + "worker=%s spawned pid=%s}" % (worker.id, str(worker.pid))), - before_fork= lambda server, worker: server.logger.info( + before_fork= lambda server, worker: server.log.info( "worker=%s spawning" % worker.id) ) @@ -110,7 +110,7 @@ class Config(object): def before_fork(self, *args): if not callable(self.conf['before_fork']): raise RuntimeError("before_fork hook isn't a callable") - return self.conf['after_fork'](*args) + return self.conf['before_fork'](*args) diff --git a/gunicorn/worker.py b/gunicorn/worker.py index 8b5b8c87..7d7f4e22 100644 --- a/gunicorn/worker.py +++ b/gunicorn/worker.py @@ -42,9 +42,13 @@ class Worker(object): self.log = logging.getLogger(__name__) self.spinner = 0 self.address = self.socket.getsockname() - + def __str__(self): return "" % self.id + + @property + def pid(self): + return os.getpid() def init_signals(self): map(lambda s: signal.signal(s, signal.SIG_DFL), self.SIGNALS)