By the way, since we're already on the subject of asyncio tasks and (truncated) stack traces, this looks like a good opportunity to ask a question that's been on my mind for a while: There's a mysterious note at the end of the documentation of asyncio.Task's get_stack() method, where it says--
For reasons beyond our control, only one stack frame is returned for a suspended coroutine. (https://docs.python.org/3/library/asyncio-task.html#asyncio.Task.get_stack )
What does the "For reasons beyond our control" mean? What is it that can possibly be beyond the control of Python? --Chris On Sat, Nov 11, 2017 at 1:47 AM, Chris Jerdonek <chris.jerdonek@gmail.com> wrote:
On Sat, Nov 11, 2017 at 12:39 AM, Nathaniel Smith <njs@pobox.com> wrote:
On Fri, Nov 10, 2017 at 9:52 PM, Chris Jerdonek <chris.jerdonek@gmail.com> wrote:
Hi, I recently encountered a situation with asyncio where the stack trace is getting truncated: an exception isn't getting chained as expected.
I was able to reduce it down to the code below.
The reduced case seems like a pattern that can come up a lot, and I wasn't able to find an issue on the CPython tracker, so I'm wondering if I'm doing something wrong or if the behavior is deliberate.
I think what you're seeing is collateral damage from some known bugginess in the generator/coroutine .throw() method: https://bugs.python.org/issue29587
Ah, thanks for the great explanation, Nathaniel!
From the original bug report Nathaniel filed above:
It's likely that more people will run into this in the future as async/await becomes more widely used. ...
:)
--Chris