From: Ben Darnell Date: Sun, 4 Sep 2011 18:26:36 +0000 (-0700) Subject: Add gen.WaitAll X-Git-Tag: v2.1.0~31 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=096595233d68940ae0b1f38b25734d9385a978d2;p=thirdparty%2Ftornado.git Add gen.WaitAll --- diff --git a/tornado/gen.py b/tornado/gen.py index ca72fe22d..46c726ee9 100644 --- a/tornado/gen.py +++ b/tornado/gen.py @@ -143,6 +143,26 @@ class Wait(YieldPoint): def get_result(self): return self.runner.pop_result(self.key) +class WaitAll(YieldPoint): + """Returns the results of multiple previous `Callbacks`. + + The argument is a sequence of `Callback` keys, and the result is + a list of results in the same order. + """ + def __init__(self, keys): + assert isinstance(keys, list) + self.keys = keys + + def start(self, runner): + self.runner = runner + + def is_ready(self): + return all(self.runner.is_ready(key) for key in self.keys) + + def get_result(self): + return [self.runner.pop_result(key) for key in self.keys] + + class Task(YieldPoint): """Runs a single asynchronous operation. diff --git a/tornado/test/gen_test.py b/tornado/test/gen_test.py index 1c1767a22..7e6641b14 100644 --- a/tornado/test/gen_test.py +++ b/tornado/test/gen_test.py @@ -115,6 +115,16 @@ class GenTest(AsyncTestCase): self.stop() self.run_gen(f) + def test_wait_all(self): + @gen.engine + def f(): + (yield gen.Callback("k1"))("v1") + (yield gen.Callback("k2"))("v2") + results = yield gen.WaitAll(["k1", "k2"]) + self.assertEqual(results, ["v1", "v2"]) + self.stop() + self.run_gen(f) + class GenSequenceHandler(RequestHandler): @asynchronous