This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: awaiting a wrapped asyncio.Task multiple times gives long, repeative tracebacks
Type: enhancement Stage: resolved
Components: asyncio Versions: Python 3.9
process
Status: closed Resolution: duplicate
Dependencies: Superseder: Incorrect traceback when future's exception is raised multiple times
View: 45924
Assigned To: Nosy List: asvetlov, iritkatriel, lilydjwg, yselivanov
Priority: normal Keywords:

Created on 2020-12-19 08:09 by lilydjwg, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (4)
msg383364 - (view) Author: lilydjwg (lilydjwg) * Date: 2020-12-19 08:09
import asyncio

async def crash(key):
  raise Exception('crash!')

async def wait(fu):
  await fu

async def main():
  crasher = asyncio.create_task(crash(()))
  fs = [wait(crasher) for _ in range(10)]
  for fu in asyncio.as_completed(fs):
    try:
      await fu
    except Exception:
      import traceback
      traceback.print_exc()

if __name__ == '__main__':
  asyncio.run(main())

This code will give a very long traceback 10 times. I expect it to be short.

I'm caching the result of an async function like this:

  async def get(
    self,
    key: Hashable,
    func: Callable[[Hashable], Coroutine[Any, Any, Any]],
  ) -> Any:
    async with self.lock:
      cached = self.cache.get(key)
      if cached is None:
        coro = func(key)
        fu = asyncio.create_task(coro)
        self.cache[key] = fu

    if asyncio.isfuture(cached): # pending
      return await cached # type: ignore
    elif cached is not None: # cached
      return cached
    else: # not cached
      r = await fu
      self.cache[key] = r
      return r

It works fine, except that when there is an exception the traceback is very long.
msg383637 - (view) Author: Andrew Svetlov (asvetlov) * (Python committer) Date: 2020-12-23 10:40
The traceback contains frames from asyncio internal machinery, that's why the traceback is long.

IFIAK Python standard library never filters such calls, asyncio is not an exception.

On the other hand, well-known pytest library supports `__tracebackhide__ = True` for skipping pytest internals in test failure reports.
I'm not sure if we want to do such black magic though.

Plus, sometimes an information about internals is helpful to detect the actual source of the problem,

I have no clear vision of how to skip internal frames easily. 

Yuri, maybe you have an idea?
msg415476 - (view) Author: Irit Katriel (iritkatriel) * (Python committer) Date: 2022-03-18 09:35
I don't think the OP is complaining about the internal asyncio machinery frames, but rather about the repetition of the "return f.result()  # May raise f.exception()." frame.

I will paste the output of the script in the next comment.
msg415477 - (view) Author: Irit Katriel (iritkatriel) * (Python committer) Date: 2022-03-18 09:36
>>> asyncio.run(main())
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
Traceback (most recent call last):
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 6, in main
  File "C:\Users\User\src\cpython\Lib\asyncio\tasks.py", line 597, in _wait_for_one
    return f.result()  # May raise f.exception().
           ^^^^^^^^^^
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  File "<stdin>", line 2, in wait
  [Previous line repeated 7 more times]
  File "<stdin>", line 2, in crash
Exception: crash!
>>>
History
Date User Action Args
2022-04-11 14:59:39adminsetgithub: 86848
2022-03-18 09:37:02iritkatrielsetstatus: open -> closed
superseder: Incorrect traceback when future's exception is raised multiple times
resolution: duplicate
stage: resolved
2022-03-18 09:36:01iritkatrielsetmessages: + msg415477
2022-03-18 09:35:37iritkatrielsetnosy: + iritkatriel
messages: + msg415476
2020-12-23 10:40:52asvetlovsetmessages: + msg383637
2020-12-19 08:09:24lilydjwgcreate