]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Add gen.WaitAll
authorBen Darnell <ben@bendarnell.com>
Sun, 4 Sep 2011 18:26:36 +0000 (11:26 -0700)
committerBen Darnell <ben@bendarnell.com>
Sun, 4 Sep 2011 18:26:36 +0000 (11:26 -0700)
tornado/gen.py
tornado/test/gen_test.py

index ca72fe22d9824790e0cdcab7bf49a2d25118070b..46c726ee959112c618aa2ea5aed2675353ea4b2b 100644 (file)
@@ -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.
 
index 1c1767a22bee45f002d498bc6e344610b62b1df2..7e6641b146a8f359bb23805a8a01855f57f6d30a 100644 (file)
@@ -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