Strange occasional `RuntimeError: Event loop is closed` out of nowhere
- Lingua principale
- Python
- Stelle
- 734
- Fork
- 412
- Merge medio
- 1g 5h
- PR unite (30g)
- 8
Descrizione
I'm implementing a kernel by inheriting from `ipykernel.kernelbase.Kernel`, as described at [Making simple Python wrapper kernels](https://jupyter-client.readthedocs.io/en/latest/wrapperkernels.html).
That generally works well, but I have a strange problem: Occasionally I get an exception `RuntimeError: Event loop is closed`:
````
Traceback (most recent call last):
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/site-packages/ipykernel/iostream.py", line 390, in _watch_pipe_fd
self.write(bts.decode(errors='replace'))
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/site-packages/ipykernel/iostream.py", line 664, in write
self._schedule_flush()
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/site-packages/ipykernel/iostream.py", line 561, in _schedule_flush
self.pub_thread.schedule(_schedule_in_thread)
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/site-packages/ipykernel/iostream.py", line 269, in schedule
f()
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/site-packages/ipykernel/iostream.py", line 559, in _schedule_in_thread
self._io_loop.call_later(self.flush_interval, self._flush)
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/site-packages/tornado/ioloop.py", line 597, in call_later
return self.call_at(self.time() + delay, callback, *args, **kwargs)
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/site-packages/tornado/platform/asyncio.py", line 206, in call_at
return self.asyncio_loop.call_later(
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/asyncio/base_events.py", line 721, in call_later
timer = self.call_at(self.time() + delay, callback, *args,
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/asyncio/base_events.py", line 732, in call_at
self._check_closed()
File "/home/ca/Store/micromamba/envs/std/lib/python3.10/asyncio/base_events.py", line 515, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
````
The traceback does not go back to my code, so I'm not certain whether I did something wrong, or there is a bug in `ipykernel.kernelbase`? I am unable to reproduce the error, in the exact same situation it sometimes happens and sometimes doesn't.
I found two other issues which mention this exception, but they are about UI events (#825) or parallelization (#534), both of which I do not use. I inherited from `ipykernel.kernelbase.Kernel` and implemented `do_execute`, which sends code to an external interpreter and sends its stdout and stderr via `self.send_response`.
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Start with ipykernel/iostream.py, especially _watch_pipe_fd, write, _schedule_flush, and the pub-thread scheduling path shown in the traceback. Compare that lifecycle with Kernel.do_execute and the external interpreter's stdout and stderr handling, then investigate when the asyncio loop is closed. Done means identifying a reproducible shutdown race or confirming the user code responsible and adding a regression test if the issue is in ipykernel.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- backend, devtools
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Da chiarire
- Idoneità per principianti
- 25/100