ipython / ipython/ipykernel

OutStream.close hangs if `watchfd=True`

未关闭
#868 1 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
734
派生
412
平均合并
1 天 5 小时
30 天内合并 PR
8

描述

When attempting to close an `OutStream` object that was created with `watchfd=True` (the default), the close operation hangs if nothing has been sent to the stream being wrapped.

Python code to reproduce:
```python
import sys

import zmq

from jupyter_client.session import Session
from ipykernel.iostream import OutStream, IOPubThread

def test():
context = zmq.Context()
pub_thread = IOPubThread(socket=context.socket(zmq.PUB))
pub_thread.start()

stream = OutStream(
session=Session(),
pub_thread=pub_thread,
name="stderr",
)
print("Closing stream", file=sys.__stdout__)
stream.close()
print("Done closing stream", file=sys.__stdout__)

pub_thread.stop()
context.destroy()

test()
```

When I run the code above, the `"Closing stream"` message is printed, but the `"Done closing stream"` message is not.

From some debugging, the `close` call is hanging when joining the auxiliary thread here: https://github.com/ipython/ipykernel/blob/221dca63d7b2e2b8fea32bf8a101d07645fc9d3c/ipykernel/iostream.py#L429

And the join is in turn hanging because the thread is stuck at a blocking read, here: https://github.com/ipython/ipykernel/blob/221dca63d7b2e2b8fea32bf8a101d07645fc9d3c/ipykernel/iostream.py#L326

I'm not an expert on this stuff, but it seems possible that making the read end of the pipe non-blocking would help. But then that results in the thread entering a busy loop, which isn't ideal.

ipykernel version: 6.9.1
Python version: 3.10.2
OS + hardware: macOS 11.6.3 (Big Sur), Intel MacBook Pro

See also #867.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。