Fix a subtle reference cycle that can lead to increased memory consumption.

Closes #1165.
This commit is contained in:
Ben Darnell 2014-08-30 15:27:31 -04:00
parent fc9a3acdb4
commit c1a123a8cd
1 changed files with 12 additions and 1 deletions

View File

@ -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