From 0357565a5e7330465db2ac4e330f44bc3ddf76f6 Mon Sep 17 00:00:00 2001 From: Ben Darnell Date: Sat, 30 Aug 2014 15:27:31 -0400 Subject: [PATCH] Fix a subtle reference cycle that can lead to increased memory consumption. Closes #1165. --- tornado/gen.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tornado/gen.py b/tornado/gen.py index 06f2715d6..4bb82d422 100644 --- a/tornado/gen.py +++ b/tornado/gen.py @@ -185,7 +185,18 @@ def _make_coroutine_wrapper(func, replace_callback): future.set_exc_info(sys.exc_info()) else: Runner(result, future, yielded) - return future + try: + return future + finally: + # Subtle memory optimization: if next() raised an exception, + # the future's exc_info contains a traceback which + # includes this stack frame. This creates a cycle, + # which will be collected at the next full GC but has + # been shown to greatly increase memory usage of + # benchmarks (relative to the refcount-based scheme + # used in the absence of cycles). We can avoid the + # cycle by clearing the local variable after we return it. + future = None future.set_result(result) return future return wrapper -- 2.47.2