From d14389cb6897833f6cb45c1002a45c87fdfddf4d Mon Sep 17 00:00:00 2001 From: "Paul J. Davis" Date: Thu, 15 Apr 2010 21:20:52 -0400 Subject: [PATCH] Added support for Tornado. Took less than a beer. --- examples/tornado/basic.py | 11 +++++++++++ gunicorn/workers/gtornado.py | 29 +++++++++++++++++++++++++++++ setup.py | 1 + 3 files changed, 41 insertions(+) create mode 100644 examples/tornado/basic.py create mode 100644 gunicorn/workers/gtornado.py diff --git a/examples/tornado/basic.py b/examples/tornado/basic.py new file mode 100644 index 00000000..c1ef8b08 --- /dev/null +++ b/examples/tornado/basic.py @@ -0,0 +1,11 @@ + +import tornado.web + +class MainHandler(tornado.web.RequestHandler): + def get(self): + self.write("Hello, world") + +app = tornado.web.Application([ + (r"/", MainHandler) +]) + diff --git a/gunicorn/workers/gtornado.py b/gunicorn/workers/gtornado.py new file mode 100644 index 00000000..6e4baf08 --- /dev/null +++ b/gunicorn/workers/gtornado.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 - +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +from tornado.httpserver import HTTPServer +from tornado.ioloop import IOLoop, PeriodicCallback + +from gunicorn.workers.base import Worker + +class TornadoWorker(Worker): + + def watchdog(self): + self.notify() + + if self.ppid != os.getppid(): + self.log.info("Parent changed, shutting down: %s" % self) + self.ioloop.stop() + + def run(self): + self.socket.setblocking(0) + self.ioloop = IOLoop.instance() + PeriodicCallback(self.watchdog, 1000, io_loop=self.ioloop).start() + + server = HTTPServer(self.app, io_loop=self.ioloop) + server._socket = self.socket + server.start(num_processes=1) + + self.ioloop.start() diff --git a/setup.py b/setup.py index db14929b..daf0fd2b 100644 --- a/setup.py +++ b/setup.py @@ -52,6 +52,7 @@ setup( sync=gunicorn.workers.sync:SyncWorker eventlet=gunicorn.workers.geventlet:EventletWorker gevent=gunicorn.workers.ggevent:GEventWorker + tornado=gunicorn.workers.gtornado:TornadoWorker [paste.server_runner] main=gunicorn.main:paste_server