Skip to main content

tornado.concurrent —工作线程和未来

使用线程和 Futures 的实用程序。

Futuresconcurrent.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,但不是线程安全的(因此更快地用于单线程事件循环)。

除了 exceptionset_exception 之外,支持方法 exc_infoset_exc_info 以在Python 2中捕获回溯。回溯在Python 3中自动可用,但在Python 2期货backport中,此信息被丢弃。此功能以前可在单独的类 TracebackFuture 中使用,现在该类已弃用别名。

在 4.0 版更改: tornado.concurrent.Future 总是一个线程不安全的 Future,支持 exc_info 方法。以前,如果该包可用,它将是线程安全 concurrent.futures.Future 的别名,并且如果不是,则回退到线程不安全的实现。

在 4.1 版更改: 如果 Future 包含错误,但从来没有观察到错误(通过调用 result()exception()exc_info()),当 Future 被垃圾收集时,将记录堆栈跟踪。这通常表示应用程序中的错误,但是在导致不期望的日志记录的情况下,可能需要通过确保观察到异常来抑制日志记录:f.add_done_callback(lambda f: f.exception())

消费方法

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

Future.done()[源代码]

如果未来已完成运行,则返回True。

Future.running()[源代码]

如果此操作当前正在运行,则返回True。

Future.cancel()[源代码]

如果可能,请取消操作。

Tornado Futures 不支持取消,所以这个方法总是返回False。

Future.cancelled()[源代码]

如果操作已取消,则返回True。

Tornado Futures 不支持取消,所以这个方法总是返回False。

生产者方法

Future.set_result(result)[源代码]

设置 Future 的结果。

它未定义在同一对象上多次调用任何 set 方法。

Future.set_exception(exception)[源代码]

设置 Future. 的例外

Future.set_exc_info(exc_info)[源代码]

设置 Future. 的异常信息

保留Python 2上的回溯。

4.0 新版功能.

tornado.concurrent.run_on_executor(*args, **kwargs)[源代码]

装饰器在执行器上异步运行同步方法。

修饰的方法可以用 callback 关键字参数调用并返回未来。

要使用的 IOLoop 和执行者由 selfio_loopexecutor 属性确定。要使用不同的属性,请将关键字参数传递给装饰器:

@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 而不是这种组合。

tornado.concurrent.chain_future(a, b)[源代码]

将两个期货链接在一起,以便当一个完成时,另一个完成。

a 的结果(成功或失败)将被复制到 b,除非在 a 完成时已经完成或取消了 b