From d55d5713a5e3534d61f1d4571c7e32b0d45f3406 Mon Sep 17 00:00:00 2001 From: alvie Date: Mon, 23 Apr 2018 16:52:09 +0800 Subject: [PATCH] make TornadoWorker compatible with Tornado 5.X --- gunicorn/workers/gtornado.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/gunicorn/workers/gtornado.py b/gunicorn/workers/gtornado.py index 2bb30cc1..7c1b1184 100644 --- a/gunicorn/workers/gtornado.py +++ b/gunicorn/workers/gtornado.py @@ -8,9 +8,10 @@ import os import sys try: - import tornado.web + import tornado except ImportError: raise RuntimeError("You need tornado installed to use this worker.") +import tornado.web import tornado.httpserver from tornado.ioloop import IOLoop, PeriodicCallback from tornado.wsgi import WSGIContainer @@ -18,6 +19,11 @@ from gunicorn.workers.base import Worker from gunicorn import __version__ as gversion +# `io_loop` arguments to many Tornado functions have been removed in Tornado 5.0 +# +IOLOOP_PARAMETER_REMOVED = tornado.version_info >= (5, 0, 0) + + class TornadoWorker(Worker): @classmethod @@ -67,8 +73,12 @@ class TornadoWorker(Worker): self.ioloop = IOLoop.instance() self.alive = True self.server_alive = False - PeriodicCallback(self.watchdog, 1000, io_loop=self.ioloop).start() - PeriodicCallback(self.heartbeat, 1000, io_loop=self.ioloop).start() + if IOLOOP_PARAMETER_REMOVED: + PeriodicCallback(self.watchdog, 1000).start() + PeriodicCallback(self.heartbeat, 1000).start() + else: + PeriodicCallback(self.watchdog, 1000, io_loop=self.ioloop).start() + PeriodicCallback(self.heartbeat, 1000, io_loop=self.ioloop).start() # Assume the app is a WSGI callable if its not an # instance of tornado.web.Application or is an @@ -109,10 +119,16 @@ class TornadoWorker(Worker): # options del _ssl_opt["do_handshake_on_connect"] del _ssl_opt["suppress_ragged_eofs"] - server = server_class(app, io_loop=self.ioloop, - ssl_options=_ssl_opt) + if IOLOOP_PARAMETER_REMOVED: + server = server_class(app, ssl_options=_ssl_opt) + else: + server = server_class(app, io_loop=self.ioloop, + ssl_options=_ssl_opt) else: - server = server_class(app, io_loop=self.ioloop) + if IOLOOP_PARAMETER_REMOVED: + server = server_class(app) + else: + server = server_class(app, io_loop=self.ioloop) self.server = server self.server_alive = True