From: Ben Darnell Date: Mon, 3 Sep 2012 19:00:26 +0000 (-0700) Subject: Add gen.YieldFuture. X-Git-Tag: v3.0.0~263^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5587a45eb2096891f45c52e2f4efc413849bcbab;p=thirdparty%2Ftornado.git Add gen.YieldFuture. --- 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