From 2f856f6fa29871e49d98f4e17ad18a0fa68c38cf Mon Sep 17 00:00:00 2001 From: Claudio Freire Date: Tue, 19 Nov 2013 14:24:48 -0300 Subject: [PATCH] Speed up gen.corouting when yielding done Futures --- tornado/gen.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/tornado/gen.py b/tornado/gen.py index 217ebdf59..23ad0aa35 100644 --- a/tornado/gen.py +++ b/tornado/gen.py @@ -390,17 +390,26 @@ class YieldFuture(YieldPoint): self.io_loop = io_loop or IOLoop.current() 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)) + if not self.future.done(): + self.runner = runner + self.key = object() + runner.register_callback(self.key) + self.io_loop.add_future(self.future, runner.result_callback(self.key)) + else: + self.runner = None + self.result = self.future.result() def is_ready(self): - return self.runner.is_ready(self.key) + if self.runner is not None: + return self.runner.is_ready(self.key) + else: + return True def get_result(self): - return self.runner.pop_result(self.key).result() - + if self.runner is not None: + return self.runner.pop_result(self.key).result() + else: + return self.result class Multi(YieldPoint): """Runs multiple asynchronous operations in parallel. -- 2.47.2