Yury Selivanov added the comment:
This is an interesting mind twister. The key problem is that
`self.runner_task` is blocked on *itself*: so Task._fut_waiter is set to the
Task.
Therefore when the task is being cancelled, `Task.cancel` simply recurses.
One way to solve this is to prohibit tasks to await on themselves. Right now
the following code "kind of" works:
async def f():
loop.call_later(1, lambda: t.set_result(42))
return await t
loop = asyncio.get_event_loop()
t = loop.create_task(f())
print(loop.run_until_complete(t))
albeit it logs errors about invalid Future state.
My proposal is to raise a ValueError if Task is asked to await on itself.
Guido, what do you think?
----------
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue27972>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com