tornado.gen — Simplify asynchronous code¶
tornado.gen is a generator-based interface to make it easier to
work in an asynchronous environment. Code using the gen module
is technically asynchronous, but it is written as a single generator
instead of a collection of separate functions.
For example, the following asynchronous handler:
could be written with gen as:
Most asynchronous functions in Tornado return a Future;
yielding this object returns its result.
You can also yield a list or dict of Futures, which will be
started at the same time and run in parallel; a list or dict of results will
be returned when they are all finished:
If the singledispatch library is available (standard in
Python 3.4, available via the singledispatch package on older
versions), additional types of objects may be yielded. Tornado includes
support for asyncio.Future and Twisted’s Deferred class when
tornado.platform.asyncio and tornado.platform.twisted are imported.
See the convert_yielded function to extend this mechanism.
Changed in version 3.2: Dict support added.
Changed in version 4.1: Support added for yielding asyncio Futures and Twisted Deferreds
via singledispatch.
Decorators¶
-
tornado.gen.coroutine(func, replace_callback=True)[source]¶ Decorator for asynchronous generators.
Any generator that yields objects from this module must be wrapped in either this decorator or
engine.Coroutines may “return” by raising the special exception
Return(value). In Python 3.3+, it is also possible for the function to simply use thereturn valuestatement (prior to Python 3.3 generators were not allowed to also return values). In all versions of Python a coroutine that simply wishes to exit early may use thereturnstatement without a value.Functions with this decorator return a
Future. Additionally, they may be called with acallbackkeyword argument, which will be invoked with the future’s result when it resolves. If the coroutine fails, the callback will not be run and an exception will be raised into the surroundingStackContext. Thecallbackargument is not visible inside the decorated function; it is handled by the decorator itself.From the caller’s perspective,
@gen.coroutineis similar to the combination of@return_futureand@gen.engine.Warning
When exceptions occur inside a coroutine, the exception information will be stored in the
Futureobject. You must examine the result of theFutureobject, or the exception may go unnoticed by your code. This means yielding the function if called from another coroutine, using something likeIOLoop.run_syncfor top-level calls, or passing theFuturetoIOLoop.add_future.
-
tornado.gen.engine(func)[source]¶ Callback-oriented decorator for asynchronous generators.
This is an older interface; for new code that does not need to be compatible with versions of Tornado older than 3.0 the
coroutinedecorator is recommended instead.This decorator is similar to
coroutine, except it does not return aFutureand thecallbackargument is not treated specially.In most cases, functions decorated with
engineshould take acallbackargument and invoke it with their result when they are finished. One notable exception is theRequestHandlerHTTP verb methods, which useself.finish()in place of a callback argument.
Yield points¶
Instances of the following classes may be used in yield expressions
in the generator. Futures may be yielded as well;
their result method will be called automatically when they are
ready. Additionally, lists of any combination of these objects may
be yielded; the result is a list of the results of each yield point
in the same order.
-
class
tornado.gen.Task[source]¶ Adapts a callback-based asynchronous function for use in coroutines.
Takes a function (and optional additional arguments) and runs it with those arguments plus a
callbackkeyword argument. The argument passed to the callback is returned as the result of the yield expression.Changed in version 4.0:
gen.Taskis now a function that returns aFuture, instead of a subclass ofYieldPoint. It still behaves the same way when yielded.
-
class
tornado.gen.Callback(key)[source]¶ Returns a callable object that will allow a matching
Waitto proceed.The key may be any value suitable for use as a dictionary key, and is used to match
Callbacksto their correspondingWaits. The key must be unique among outstanding callbacks within a single run of the generator function, but may be reused across different runs of the same function (so constants generally work fine).The callback may be called with zero or one arguments; if an argument is given it will be returned by
Wait.Deprecated since version 4.0: Use
Futuresinstead.
-
class
tornado.gen.Wait(key)[source]¶ Returns the argument passed to the result of a previous
Callback.Deprecated since version 4.0: Use
Futuresinstead.
-
class
tornado.gen.WaitAll(keys)[source]¶ Returns the results of multiple previous
Callbacks.The argument is a sequence of
Callbackkeys, and the result is a list of results in the same order.WaitAllis equivalent to yielding a list ofWaitobjects.Deprecated since version 4.0: Use
Futuresinstead.
-
class
tornado.gen.YieldPoint[source]¶ Base class for objects that may be yielded from the generator.
Deprecated since version 4.0: Use
Futuresinstead.-
start(runner)[source]¶ Called by the runner after the generator has yielded.
No other methods will be called on this object before
start.
-
Other classes¶
-
exception
tornado.gen.Return(value=None)[source]¶ Special exception to return a value from a
coroutine.If this exception is raised, its value argument is used as the result of the coroutine:
@gen.coroutine def fetch_json(url): response = yield AsyncHTTPClient().fetch(url) raise gen.Return(json_decode(response.body))In Python 3.3, this exception is no longer necessary: the
returnstatement can be used directly to return a value (previouslyyieldandreturnwith a value could not be combined in the same function).By analogy with the return statement, the value argument is optional, but it is never necessary to
raise gen.Return(). Thereturnstatement can be used with no arguments instead.
-
class
tornado.gen.Arguments¶ The result of a yield expression whose callback had more than one argument (or keyword arguments).
The
Argumentsobject is acollections.namedtupleand can be used either as a tuple(args, kwargs)or an object with attributesargsandkwargs.