tornado.concurrent
—工作线程和未来¶
使用线程和 Futures
的实用程序。
Futures
是 concurrent.futures
包中在Python 3.2中引入的并发编程的模式。这个包定义了一个设计用于协同程序的大多数兼容的 Future
类,以及一些与 concurrent.futures
包交互的实用函数。
-
class
tornado.concurrent.
Future
[源代码]¶ 异步结果的占位符。
Future
封装异步操作的结果。在同步应用程序中,Futures
用于等待线程或进程池的结果;在Tornado中,它们通常与IOLoop.add_future
一起使用或通过在gen.coroutine
中产生它们。tornado.concurrent.Future
类似于concurrent.futures.Future
,但不是线程安全的(因此更快地用于单线程事件循环)。除了
exception
和set_exception
之外,支持方法exc_info
和set_exc_info
以在Python 2中捕获回溯。回溯在Python 3中自动可用,但在Python 2期货backport中,此信息被丢弃。此功能以前可在单独的类TracebackFuture
中使用,现在该类已弃用别名。在 4.0 版更改:
tornado.concurrent.Future
总是一个线程不安全的Future
,支持exc_info
方法。以前,如果该包可用,它将是线程安全concurrent.futures.Future
的别名,并且如果不是,则回退到线程不安全的实现。
消费方法¶
-
Future.
result
(timeout=None)[源代码]¶ 如果操作成功,返回其结果。如果失败,重新提出它的异常。
此方法采用
timeout
参数与concurrent.futures.Future
兼容,但是在Future
完成之前调用它是一个错误,因此从不使用timeout
。
-
Future.
exception
(timeout=None)[源代码]¶ 如果操作引发异常,则返回
Exception
对象。否则返回None。此方法采用
timeout
参数与concurrent.futures.Future
兼容,但是在Future
完成之前调用它是一个错误,因此从不使用timeout
。
-
Future.
exc_info
()[源代码]¶ 返回与
sys.exc_info
或None相同格式的元组。4.0 新版功能.
-
Future.
add_done_callback
(fn)[源代码]¶ 将给定的回调附加到
Future
。当Future已完成运行并且其结果可用时,将使用
Future
作为其参数来调用它。在Tornado考虑使用IOLoop.add_future
而不是直接调用add_done_callback
。
生产者方法¶
-
tornado.concurrent.
run_on_executor
(*args, **kwargs)[源代码]¶ 装饰器在执行器上异步运行同步方法。
修饰的方法可以用
callback
关键字参数调用并返回未来。要使用的
IOLoop
和执行者由self
的io_loop
和executor
属性确定。要使用不同的属性,请将关键字参数传递给装饰器:@run_on_executor(executor='_thread_pool') def foo(self): pass
在 4.2 版更改: 添加了使用备用属性的关键字参数。
-
tornado.concurrent.
return_future
(f)[源代码]¶ 装饰器使得通过回调返回的函数返回
Future
。包装的函数应该使用一个
callback
关键字参数,并在完成后用一个参数调用它。为了信号失败,函数可以简单地引发异常(将由StackContext
捕获并传递给Future
)。从调用者的角度来看,回调参数是可选的。如果给出一个,当函数以
Future.result()
作为参数完成时,它将被调用。如果函数失败,则不会运行回调,并且异常将引发到周围的StackContext
中。如果没有回调,调用者应该使用
Future
等待函数完成(可能通过在gen.engine
函数中产生它,或者将它传递给IOLoop.add_future
)。用法:
@return_future def future_func(arg1, arg2, callback): # Do stuff (possibly asynchronous) callback(result) @gen.engine def caller(callback): yield future_func(arg1, arg2) callback()
注意,如果首先出现
@return_future
,则@return_future
和@gen.engine
可以应用于相同的功能。然而,考虑使用@gen.coroutine
而不是这种组合。