ipython / ipython/ipykernel

Strange occasional `RuntimeError: Event loop is closed` out of nowhere

Aperta
#1,155 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.