From 096595233d68940ae0b1f38b25734d9385a978d2 Mon Sep 17 00:00:00 2001 From: Ben Darnell Date: Sun, 4 Sep 2011 11:26:36 -0700 Subject: [PATCH] Add gen.WaitAll --- tornado/gen.py | 20 ++++++++++++++++++++ tornado/test/gen_test.py | 10 ++++++++++ 2 files changed, 30 insertions(+) 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 -- 2.47.2