Bridges between the Twisted reactor and Tornado IOLoop.
This module lets you run applications and libraries written for Twisted in a Tornado application. It can be used in two modes, depending on which library’s underlying event loop you want to use.
This module has been tested with Twisted versions 11.0.0 and newer.
Twisted on Tornado
class tornado.platform.twisted.TornadoReactor[source]
Twisted reactor built on the Tornado IOLoop.
TornadoReactor
implements the Twisted reactor interface on top of
the Tornado IOLoop. To use it, simply call install
at the beginning
of the application:
import tornado.platform.twisted
tornado.platform.twisted.install()
from twisted.internet import reactor
When the app is ready to start, call IOLoop.current().start()
instead of reactor.run()
.
It is also possible to create a non-global reactor by calling
tornado.platform.twisted.TornadoReactor()
. However, if
the IOLoop
and reactor are to be short-lived (such as those used in
unit tests), additional cleanup may be required. Specifically, it is
recommended to call:
reactor.fireSystemEvent('shutdown')
reactor.disconnectAll()
before closing the IOLoop
.
Changed in version 5.0: The io_loop
argument (deprecated since version 4.1) has been removed.
tornado.platform.twisted.install()[source]
Install this package as the default Twisted reactor.
install()
must be called very early in the startup process,
before most other twisted-related imports. Conversely, because it
initializes the IOLoop
, it cannot be called before
fork_processes
or multi-process start
. These
conflicting requirements make it difficult to use TornadoReactor
in multi-process mode, and an external process manager such as
supervisord
is recommended instead.
Changed in version 5.0: The io_loop
argument (deprecated since version 4.1) has been removed.
Tornado on Twisted
class tornado.platform.twisted.TwistedIOLoop[source]
IOLoop implementation that runs on Twisted.
TwistedIOLoop
implements the Tornado IOLoop interface on top of
the Twisted reactor. Recommended usage:
from tornado.platform.twisted import TwistedIOLoop
from twisted.internet import reactor
TwistedIOLoop().install()
# Set up your tornado application as usual using `IOLoop.instance`
reactor.run()
Uses the global Twisted reactor by default. To create multiple
TwistedIOLoops
in the same process, you must pass a unique reactor
when constructing each one.
Not compatible with tornado.process.Subprocess.set_exit_callback
because the SIGCHLD
handlers used by Tornado and Twisted conflict
with each other.
See also tornado.ioloop.IOLoop.install()
for general notes on
installing alternative IOLoops.
Twisted DNS resolver
class tornado.platform.twisted.TwistedResolver[source]
Twisted-based asynchronous resolver.
This is a non-blocking and non-threaded resolver. It is
recommended only when threads cannot be used, since it has
limitations compared to the standard getaddrinfo
-based
Resolver
and
DefaultExecutorResolver
. Specifically, it returns at
most one result, and arguments other than host
and family
are ignored. It may fail to resolve when family
is not
socket.AF_UNSPEC
.
Requires Twisted 12.1 or newer.
Changed in version 5.0: The io_loop
argument (deprecated since version 4.1) has been removed.