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

Open
#1,155 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
25/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Stale
Tech stack
python
Domain
backend, devtools

Research direction

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.

Written by the indexing model from the issue text.

Description

I'm implementing a kernel by inheriting from ipykernel.kernelbase.Kernel, as described at Making simple Python wrapper kernels.

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.

Dominant language
Python
Stars
734
Forks
411
Avg merge
1d 2h
Merged PRs (30d)
9

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from ipython/ipykernel

All issues in ipython/ipykernel

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.