asyncio. On Python 3, the IOLoop is always a wrapper around the asyncio event loop, and asyncio.Future and asyncio.Task are used instead of their Tornado counterparts. This means that libraries based on asyncio can be mixed relatively seamlessly with those using Tornado. While care has been taken to minimize the disruption from this change, code changes may be required for compatibility with Tornado 5.0, as detailed in the following section.Python 3.3 is no longer supported.
Versions of Python 2.7 that predate the ssl module update are no longer supported. (The ssl module was updated in version 2.7.9, although in some distributions the updates are present in builds with a lower version number. Tornado requires ssl.SSLContext,ssl.create_default_context, and ssl.match_hostname)
Versions of Python 3.5 prior to 3.5.2 are no longer supported due to a change in the async iterator protocol in that version.
The trollius project (asyncio backported to Python 2) is no longer supported.
tornado.concurrent.Future is now an alias for asyncio.Future when running on Python 3. This results in a number of minor behavioral changes:
Futureobjects can only be created while there is a currentIOLoop- The timing of callbacks scheduled with
Future.add_done_callbackhas changed.tornado.concurrent.future_add_done_callbackcan be used to make the behavior more like older versions of Tornado (but not identical). Some of these changes are also present in the Python 2 version oftornado.concurrent.Futureto minimize the difference between Python 2 and 3.- Cancellation is now partially supported, via
asyncio.Future.cancel. A canceledFuturecan no longer have its result set. Applications that handleFutureobjects directly may want to usetornado.concurrent.future_set_result_unless_cancelled. In native coroutines, cancellation will cause an exception to be raised in the coroutine.- The
exc_infoandset_exc_infomethods are no longer present. Usetornado.concurrent.future_set_exc_infoto replace the latter, and raise the exception withresultto replace the former.
io_loop arguments to many Tornado functions have been removed. Use IOLoop.current()instead of passing IOLoop objects explicitly.
On Python 3, IOLoop is always a wrapper around the asyncio event loop. IOLoop.configure is effectively removed on Python 3 (for compatibility, it may be called to redundantly specify theasyncio-backed IOLoop)
IOLoop.instance is now a deprecated alias for IOLoop.current. Applications that need the cross-thread communication behavior facilitated by IOLoop.instance should use their own global variable instead.
futures (concurrent.futures backport) package is now required on Python 2.7.certifi and backports.ssl-match-hostname packages are no longer required on Python 2.7.asyncio.Future objects.tornado.authGoogleOAuth2Mixin now uses a newer set of URLs.tornado.autoreload__main__.__spec to more reliably reconstruct the original command line and avoid modifying PYTHONPATH.io_loop argument to tornado.autoreload.start has been removed.tornado.concurrenttornado.concurrent.Future is now an alias for asyncio.Future when running on Python 3. See “Backwards-compatibility notes” for more.Future no longer blocks while callbacks are being run. Instead, the callbacks are scheduled on the next IOLoop iteration.tornado.concurrent.TracebackFuture has been removed.tornado.concurrent.chain_future now works with all three kinds of Futures (Tornado, asyncio, and concurrent.futures)io_loop argument to tornado.concurrent.run_on_executor has been removed.future_set_result_unless_cancelled, future_set_exc_info, and future_add_done_callback help mask the difference between asyncio.Future and Tornado’s previous Future implementation.tornado.curl_httpclienttime_info response attribute now includes appconnect in addition to other measurements.CurlAsyncHTTPClient now breaks circular references that could delay garbage collection.io_loop argument to the CurlAsyncHTTPClient constructor has been removed.tornado.gentornado.gen.TimeoutError is now an alias for tornado.util.TimeoutError.Futures created by this module now attributes them to their proper caller instead of the coroutine machinery.asyncio.Task is used instead of the Tornado coroutine runner. This improves compatibility with some asyncio libraries and adds support for cancellation.io_loop arguments to YieldFuture and with_timeout have been removed.tornado.httpclientio_loop argument to all AsyncHTTPClient constructors has been removed.tornado.httpserverContent-Length and Transfer-Encoding headers are no longer sent with 1xx or 204 responses (this was already true of 304 responses).Connection: close header is sent with the response.io_loop argument to the HTTPServer constructor has been removed.X-Scheme or X-Forwarded-Proto header is present, only the last is used.tornado.httputilHTTPServerRequest objects (which are sometimes used in log messages) no longer includes the request headers.qs_to_qsl converts the result of urllib.parse.parse_qs to name-value pairs.tornado.iolooptornado.ioloop.TimeoutError is now an alias for tornado.util.TimeoutError.IOLoop.instance is now a deprecated alias for IOLoop.current.IOLoop.install and IOLoop.clear_instance are deprecated.IOLoop.initialized has been removed.asyncio-backed IOLoop is always used and alternative IOLoopimplementations cannot be configured. IOLoop.current and related methods pass through toasyncio.get_event_loop.run_sync cancels its argument on a timeout. This results in better stack traces (and avoids log messages about leaks) in native coroutines.IOLoop.run_in_executor and IOLoop.set_default_executor make it easier to run functions in other threads from native coroutines (since concurrent.futures.Future does not support await).PollIOLoop (the default on Python 2) attempts to detect misuse of IOLoop instances across os.fork.io_loop argument to PeriodicCallback has been removed.PeriodicCallback in one thread and start it in another without passing an explicit event loop.IOLoop.set_blocking_signal_threshold and IOLoop.set_blocking_log_threshold methods are deprecated because they are not implemented for the asyncio event loop`. Use thePYTHONASYNCIODEBUG=1 environment variable instead.IOLoop.clear_current now works if it is called before any current loop is established.IOLoop.initialized method has been removed.tornado.iostreamio_loop argument to the IOStream constructor has been removed.BaseIOStream.read_into provides a minimal-copy alternative toBaseIOStream.read_bytes.BaseIOStream.write is now much more efficient for very large amounts of data.IOStream.error could be inaccurate.memoryview can no longer result in “BufferError: Existing exports of data: object cannot be re-sized”.tornado.locksFuture changes, waiters are always notified asynchronously with respect to Condition.notify.tornado.netutilResolver now uses IOLoop.run_in_executor. ExecutorResolver, BlockingResolver, and ThreadedResolver are deprecated.io_loop arguments to add_accept_handler, ExecutorResolver, and ThreadedResolverhave been removed.add_accept_handler returns a callable which can be used to remove all handlers that were added.OverrideResolver now accepts per-family overrides.tornado.optionstornado.platform.asyncioAsyncIOLoop and AsyncIOMainLoop are now used automatically when appropriate; referencing them explicitly is no longer recommended.IOLoop or making it current now also sets the asyncio event loop for the current thread. Closing an IOLoop closes the corresponding asyncio event loop.to_tornado_future and to_asyncio_future are deprecated since they are now no-ops.AnyThreadEventLoopPolicy can now be used to easily allow the creation of event loops on any thread (similar to Tornado’s prior policy).tornado.platform.caresresolverio_loop argument to CaresResolver has been removed.tornado.platform.twistedio_loop arguments to TornadoReactor, TwistedResolver, and tornado.platform.twisted.install have been removed.tornado.processio_loop argument to the Subprocess constructor and Subprocess.initialize has been removed.tornado.routingtornado.simple_httpclientio_loop argument to SimpleAsyncHTTPClient has been removed.ssl.create_default_context by default.tornado.tcpclientio_loop argument to the TCPClient constructor has been removed.TCPClient.connect has a new timeout argument.tornado.testingtornado.testing.get_unused_port and tornado.testing.LogTrapTestCase have been removed.AsyncHTTPTestCase.fetch now supports absolute URLs.AsyncHTTPTestCase.fetch now connects to 127.0.0.1 instead of localhost to be more robust against faulty ipv6 configurations.tornado.utiltornado.util.TimeoutError replaces tornado.gen.TimeoutError and tornado.ioloop.TimeoutError.Configurable now supports configuration at multiple levels of an inheritance hierarchy.tornado.webRequestHandler.set_status no longer requires that the given status code appear in http.client.responses.RedirectHandler now copies any query arguments from the request to the redirect location.If-None-Match and If-Modified-Since headers are present in a request to StaticFileHandler, the latter is now ignored.tornado.websocketWebSocketHandler.write_message now raises WebSocketClosedError if the connection closes while the write is in progress.io_loop argument to websocket_connect has been removed.