Bug report
Bug description:
Repro 1 - context not a context:
import asyncio
async def child():
return 1
async def main():
asyncio.Task(child(), loop=asyncio.get_running_loop(),
eager_start=True, context=2.14)
asyncio.run(main())
Actually the repro will hang, and the displayed exception is not readable and informative about what was wrong:
➜ cpython git:(main) ✗ ./python.exe repro.py
Exception in callback <_asyncio.TaskStepMethWrapper object at 0x104911ba0>()
handle: <Handle <_asyncio.TaskStepMethWrapper object at 0x104911ba0>()>
Traceback (most recent call last):
File "/Users/timofeiivankov/cpython/Lib/asyncio/events.py", line 91, in _run
self._context.run(self._callback, *self._args)
~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Invalid attempt to leave task <Task finished name='Task-1' coro=<main() done, defined at /Users/timofeiivankov/cpython/repro.py:6> exception=TypeError('an instance of Context was expected')> while task <Task pending name='Task-2' coro=<child() running at /Users/timofeiivankov/cpython/repro.py:3>> is entered.
Repro 2 - a valid Context that is already entered
import asyncio, contextvars
async def child():
return 1
async def main():
loop = asyncio.get_running_loop()
ctx = contextvars.copy_context()
ctx.run(lambda: asyncio.Task(child(), loop=loop, eager_start=True, context=ctx))
asyncio.run(main())
Also hangs - type check alone doesn't cover this path
Expected behaviour: the constructor raises and the loop stays usable
TypeError: a contextvars.Context was expected, got float
Proposed fix: add type check for context, and restore the current task in the _PyContext_Enter failure branch of task_eager_start.
I have fix for this already
CPython versions tested on:
CPython main branch
Operating systems tested on:
macOS
Linked PRs
Bug report
Bug description:
Repro 1 - context not a context:
Actually the repro will hang, and the displayed exception is not readable and informative about what was wrong:
Repro 2 - a valid Context that is already entered
Also hangs - type check alone doesn't cover this path
Expected behaviour: the constructor raises and the loop stays usable
Proposed fix: add type check for
context, and restore the current task in the_PyContext_Enterfailure branch oftask_eager_start.I have fix for this already
CPython versions tested on:
CPython main branch
Operating systems tested on:
macOS
Linked PRs