# 需要导入模块: from tornado import gen [as 别名]
# 或者: from tornado.gen import Runner [as 别名]
def test_yield_in_with(self):
@gen.engine
def f():
try:
self.callback = yield gen.Callback('a')
with StackContext(functools.partial(self.context, 'c1')):
# This yield is a problem: the generator will be suspended
# and the StackContext's __exit__ is not called yet, so
# the context will be left on _state.contexts for anything
# that runs before the yield resolves.
yield gen.Wait('a')
except StackContextInconsistentError:
# In python <= 3.3, this suspended generator is never garbage
# collected, so it remains suspended in the 'yield' forever.
# Starting in 3.4, it is made collectable by raising
# a GeneratorExit exception from the yield, which gets
# converted into a StackContextInconsistentError by the
# exit of the 'with' block.
pass
with self.assertRaises(StackContextInconsistentError):
f()
self.wait()
# Cleanup: to avoid GC warnings (which for some reason only seem
# to show up on py33-asyncio), invoke the callback (which will do
# nothing since the gen.Runner is already finished) and delete it.
self.callback()
del self.callback