在jQuery $.when(promise1, promise2...)
中用作主承诺来表示其子承诺的总体状态。然后,我们可以将.done(callback)
附加到$.when
承诺,这样当所有promise1, promise2...
完成后,callback
将被执行。
在Python(Tornado)中,Future
的行为类似于javascript中的承诺,而fetch()
中的AsyncHTTPClient
会返回Future。
在下面的代码中,我有一个期货清单
from tornado.httpclient import AsyncHTTPClient
httpclient = AsyncHTTPClient()
futures = [
httpclient.fetch("http://google.com")
httpclient.fetch("http://example.com")
httpclient.fetch("http://example.org")
]
def all_futures_done_callback():
...
当所有期货结束时,如何执行all_futures_done_callback
?
答案 0 :(得分:2)
在协程中,很容易等待多个期货;只需将它们全部作为列表:
@gen.coroutine
def f():
futures = [
httpclient.fetch("http://google.com")
httpclient.fetch("http://example.com")
httpclient.fetch("http://example.org")
]
responses = yield futures
要使用回调而不是协同程序执行此操作,您需要像mgilson的答案。
答案 1 :(得分:1)
在我看来,您需要自己构建此功能。这是未经测试的,但这样的事情似乎应该有效:
class FutureCollection(Future):
def __init__(self, *args, **kwargs):
super(FutureCollection, self).__init__(*args, **kwargs)
self._waiting_for = []
def _check_all_done_and_resolve(self, future):
if all(f.done() for f in self._waiting_for):
# Maybe check for exceptions a. la.
# http://tornado.readthedocs.org/en/latest/_modules/tornado/concurrent.html#chain_future
self.set_result(None) # Not sure what the result should be.
def add_future(self, future):
self._waiting_for.append(future)
future.add_done_callback(self._check_all_done_and_resolve)
@property
def futures(self):
# Read-only access to the futures that have been added.
return iter(self._waiting_for)