import collections
import functools
+import itertools
import sys
import types
i = YieldFuture(i)
self.children.append(i)
assert all(isinstance(i, YieldPoint) for i in self.children)
+ self.unfinished_children = set(self.children)
def start(self, runner):
for i in self.children:
i.start(runner)
def is_ready(self):
- return all(i.is_ready() for i in self.children)
+ finished = list(itertools.takewhile(
+ lambda i: i.is_ready(), self.unfinished_children))
+ self.unfinished_children.difference_update(finished)
+ return not self.unfinished_children
def get_result(self):
return [i.get_result() for i in self.children]
from __future__ import absolute_import, division, print_function, with_statement
import functools
+import time
+
from tornado.concurrent import return_future
from tornado.escape import url_escape
from tornado.httpclient import AsyncHTTPClient
self.stop()
self.run_gen(f)
+ @gen_test
+ def test_multi_performance(self):
+ # Yielding a list used to have quadratic performance; make
+ # sure a large list stays reasonable. On my laptop a list of
+ # 2000 used to take 1.8s, now it takes 0.12.
+ start = time.time()
+ yield [gen.Task(self.io_loop.add_callback) for i in range(2000)]
+ end = time.time()
+ self.assertLess(end - start, 1.0)
+
@gen_test
def test_future(self):
result = yield self.async_future(1)