Commit 0ac3a0cd authored by Yury Selivanov's avatar Yury Selivanov

asyncio: Make Tasks check if Futures are attached to the same event loop

See https://github.com/python/asyncio/pull/303 for details
parent dddc7819
......@@ -251,7 +251,13 @@ class Task(futures.Future):
else:
if isinstance(result, futures.Future):
# Yielded Future must come from Future.__iter__().
if result._blocking:
if result._loop is not self._loop:
self._loop.call_soon(
self._step,
RuntimeError(
'Task {!r} got Future {!r} attached to a '
'different loop'.format(self, result)))
elif result._blocking:
result._blocking = False
result.add_done_callback(self._wakeup)
self._fut_waiter = result
......
......@@ -76,6 +76,21 @@ class TaskTests(test_utils.TestCase):
def setUp(self):
self.loop = self.new_test_loop()
def test_other_loop_future(self):
other_loop = asyncio.new_event_loop()
fut = asyncio.Future(loop=other_loop)
@asyncio.coroutine
def run(fut):
yield from fut
try:
with self.assertRaisesRegex(RuntimeError,
r'Task .* got Future .* attached'):
self.loop.run_until_complete(run(fut))
finally:
other_loop.close()
def test_task_class(self):
@asyncio.coroutine
def notmuch():
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment