Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

set_exception_handler is not handling exception as expected. #360

Open
Arun4rangan opened this issue Aug 31, 2020 · 0 comments
Open

set_exception_handler is not handling exception as expected. #360

Arun4rangan opened this issue Aug 31, 2020 · 0 comments

Comments

@Arun4rangan
Copy link

@Arun4rangan Arun4rangan commented Aug 31, 2020

  • uvloop version: 0.14.0
  • Python version: 3.6.9
  • Platform: Linux c965e3d4adf2 5.3.0-1032-gcp #34~18.04.1-Ubuntu SMP
  • Can you reproduce the bug with PYTHONASYNCIODEBUG in env?: yes
  • Does uvloop behave differently from vanilla asyncio? How?:

Yes asyncio default loop catches TimeoutError: [Errno 110] Connection timed out whereas uvloop closes the loop and throws RuntimeError: Event loop stopped before Future completed.

I ran across this bug when dealing with websockets (you could see the issue - aaugustin/websockets#823)

To log this error :

def handle_async_exception(loop, ctx):
    logger.error("Loop error occured", ctx=ctx)
loop = asyncio.get_event_loop()
loop.set_exception_handler(handle_async_exception)

Python websockets throw a TimeoutError when a client is not found in a certain time limit (for ping/ pongs). In asyncio, the error is bubbled to set_exception_handler, and I could log it there as expected. However in uvloop, instead of having the exception being bubbled to exception_handler, it shuts down the loop. I get the following error:

Process Process-9:
Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/home/streaming/app/emitter_app/emitter.py", line 60, in start_emitter
    loop.run_until_complete(asyncio.gather(server.serve(), push_payload(queue)))
  File "uvloop/loop.pyx", line 1454, in uvloop.loop.Loop.run_until_complete
RuntimeError: Event loop stopped before Future completed.

Thanks for your time! Appreciate such a neat package to make asyncio faster in python.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
1 participant
You can’t perform that action at this time.