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:
Future
objects can only be created while there is a currentIOLoop
- The timing of callbacks scheduled with
Future.add_done_callback
has changed.tornado.concurrent.future_add_done_callback
can 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.Future
to minimize the difference between Python 2 and 3.- Cancellation is now partially supported, via
asyncio.Future.cancel
. A canceledFuture
can no longer have its result set. Applications that handleFuture
objects 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_info
andset_exc_info
methods are no longer present. Usetornado.concurrent.future_set_exc_info
to replace the latter, and raise the exception withresult
to 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.auth
GoogleOAuth2Mixin
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.concurrent
tornado.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_httpclient
time_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.gen
tornado.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.httpclient
io_loop
argument to all AsyncHTTPClient
constructors has been removed.tornado.httpserver
Content-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.httputil
HTTPServerRequest
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.ioloop
tornado.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 IOLoop
implementations 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.iostream
io_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.locks
Future
changes, waiters are always notified asynchronously with respect to Condition.notify
.tornado.netutil
Resolver
now uses IOLoop.run_in_executor
. ExecutorResolver
, BlockingResolver
, and ThreadedResolver
are deprecated.io_loop
arguments to add_accept_handler
, ExecutorResolver
, and ThreadedResolver
have 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.options
tornado.platform.asyncio
AsyncIOLoop
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.caresresolver
io_loop
argument to CaresResolver
has been removed.tornado.platform.twisted
io_loop
arguments to TornadoReactor
, TwistedResolver
, and tornado.platform.twisted.install
have been removed.tornado.process
io_loop
argument to the Subprocess
constructor and Subprocess.initialize
has been removed.tornado.routing
tornado.simple_httpclient
io_loop
argument to SimpleAsyncHTTPClient
has been removed.ssl.create_default_context
by default.tornado.tcpclient
io_loop
argument to the TCPClient
constructor has been removed.TCPClient.connect
has a new timeout
argument.tornado.testing
tornado.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.util
tornado.util.TimeoutError
replaces tornado.gen.TimeoutError
and tornado.ioloop.TimeoutError
.Configurable
now supports configuration at multiple levels of an inheritance hierarchy.tornado.web
RequestHandler.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.websocket
WebSocketHandler.write_message
now raises WebSocketClosedError
if the connection closes while the write is in progress.io_loop
argument to websocket_connect
has been removed.