From 5587a45eb2096891f45c52e2f4efc413849bcbab Mon Sep 17 00:00:00 2001 From: Ben Darnell Date: Mon, 3 Sep 2012 12:00:26 -0700 Subject: [PATCH] Add gen.YieldFuture. --- tornado/gen.py | 19 +++++++++++++++++++ tornado/test/concurrent_test.py | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/tornado/gen.py b/tornado/gen.py index 506697d7b..bc0f935dc 100644 --- a/tornado/gen.py +++ b/tornado/gen.py @@ -69,6 +69,7 @@ import operator import sys import types +from tornado.ioloop import IOLoop from tornado.stack_context import ExceptionStackContext @@ -247,6 +248,24 @@ class Task(YieldPoint): return self.runner.pop_result(self.key) +class YieldFuture(YieldPoint): + def __init__(self, future, io_loop=None): + self.future = future + self.io_loop = io_loop or IOLoop.instance() + + def start(self, runner): + self.runner = runner + self.key = object() + runner.register_callback(self.key) + self.io_loop.add_future(self.future, runner.result_callback(self.key)) + + def is_ready(self): + return self.runner.is_ready(self.key) + + def get_result(self): + return self.runner.pop_result(self.key).result() + + class Multi(YieldPoint): """Runs multiple asynchronous operations in parallel. diff --git a/tornado/test/concurrent_test.py b/tornado/test/concurrent_test.py index 87f590e15..2cf371894 100644 --- a/tornado/test/concurrent_test.py +++ b/tornado/test/concurrent_test.py @@ -158,6 +158,26 @@ class ClientTestMixin(object): self.wait() self.assertRaisesRegexp(CapError, "already capitalized", future.result) + def test_generator(self): + @gen.engine + def f(): + result = yield gen.YieldFuture(self.client.capitalize("hello"), + io_loop=self.io_loop) + self.assertEqual(result, "HELLO") + self.stop() + f() + self.wait() + + def test_generator_error(self): + @gen.engine + def f(): + with self.assertRaisesRegexp(CapError, "already capitalized"): + yield gen.YieldFuture(self.client.capitalize("HELLO"), + io_loop=self.io_loop) + self.stop() + f() + self.wait() + class ManualClientTest(ClientTestMixin, AsyncTestCase, LogTrapTestCase): client_class = ManualCapClient -- 2.47.3