jupyter_server
jupyter_server copied to clipboard
Slower atexit methods do not run to completion
Description
Cleanup methods that are slower do not run to completion when restarting kernel.
Reproduce
- Create a new IPython notebook in Jupyter Lab.
- Create and execute a new cell with the following code
import atexit
import time
from pathlib import Path
def write_hello():
time.sleep(5)
Path("hello.txt").write_text("hello")
atexit.register(write_hello)
- Click on "Restart kernel"
- The new file "hello.txt" was not created.
Expected behavior
The "hello.txt" should have been created.
Context
- Operating System and version: ArchLinux
- Browser and version: Firefox Developer version 125.0b6
- JupyterLab version: 4.1.6
- Jupyter server version: 2.14.0
Additional info
Jupyter lab shows a TimeoutError on console.
[E 2024-05-02 10:50:31.388 ServerApp] Uncaught exception GET /api/kernels/28d27336-01eb-4fed-9b24-e5b4a1ae8ef4/channels?session_id=3fa3bd68-c341-4029-b71b-92c68bdc3ba6 (127.0.0.1)
HTTPServerRequest(protocol='http', host='localhost:8888', method='GET', uri='/api/kernels/28d27336-01eb-4fed-9b24-e5b4a1ae8ef4/channels?session_id=3fa3bd68-c341-4029-b71b-92c68bdc3ba6', version='HTTP/1.1', remote_ip='127.0.0.1')
Traceback (most recent call last):
File "/home/parantapa/miniconda3/envs/notebook_env/lib/python3.11/site-packages/tornado/web.py", line 1790, in _execute
result = await result
^^^^^^^^^^^^
File "/home/parantapa/miniconda3/envs/notebook_env/lib/python3.11/site-packages/jupyter_server/services/kernels/websocket.py", line 65, in get
await self.pre_get()
File "/home/parantapa/miniconda3/envs/notebook_env/lib/python3.11/site-packages/jupyter_server/services/kernels/websocket.py", line 59, in pre_get
await self.connection.prepare()
File "/home/parantapa/miniconda3/envs/notebook_env/lib/python3.11/site-packages/jupyter_server/services/kernels/connection/channels.py", line 318, in prepare
raise TimeoutError(msg)
TimeoutError: Kernel never reached an 'alive' state.
This error is gone when using a larger kernel_info_timeout. However, the atexit method still does not run to completion.
The above code works as expected if run from IPython (inside shell).
I have been trying to find the spot in Jupyter Lab, Jupyter Server and Ipython that is responsible for killing the kernel. But I since I am not familiar enough, I haven't figured it out.
I had posted this issue on JupyterLab https://github.com/jupyterlab/jupyterlab/issues/16276#issue-2275760074 and was told this might be a better place to report the issue.