MagicStack / MagicStack/uvloop
set_exception_handler is not handling exception as expected.
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Cython
- Sterne
- 11.9k
- Forks
- 616
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
* **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 - https://github.com/aaugustin/websockets/issues/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.
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, uvloop/loop.pyx im Bereich von run_until_complete (Zeile 1454) mit dem Verhalten von vanilla asyncio bei der Behandlung von set_exception_handler zu vergleichen. Reproduziere das websockets-Timeout-Szenario unter Python 3.6.9 mit aktiviertem PYTHONASYNCIODEBUG; fertig ist es, wenn der TimeoutError den konfigurierten Exception-Handler erreicht, ohne die Schleife unerwartet zu stoppen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- backend, networking
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100