ipython / ipython/ipykernel

Log messages written from a helper thread appear in the wrong notebook cell (regression)

オープン
#1,491 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Python
スター
734
フォーク
412
平均マージ
1日 5時間
マージ済み PR(30日)
8

説明

I recently found that, with some configurations, log messages emitted by [Loguru](https://github.com/Delgan/loguru) would appear in the wrong Jupyter notebook cell: namely, the cell that initialized the logger, rather than the cell that was responsible for the log message. I opened Delgan/loguru#1427 to address this, but have since closed it, since the issue appears to be a regression in `ipykernel`, not in Loguru itself.

The problem appears for all versions of Loguru, but only for ipykernel >= 6.29. It is confined to the case where the logger is configured to write messages using a separate helper thread, which is useful when logging from multiple threads simultaneously. A minimal working example that illustrates the issue _without_ the use of Loguru is the following:

(cell 1)
```
import sys
import multiprocessing
import threading

class Logger:
def __init__(self, sink):
self.sink = sink
self.queue = multiprocessing.SimpleQueue()
self.lock = threading.Lock()
self.thread = threading.Thread(target=self.write_from_queue, daemon=True)
self.thread.start()

def write_from_queue(self):
while True:
message = self.queue.get()
with self.lock:
self.sink.write(message)

def log(self, message):
self.queue.put(message)
```

(cell 2)
```
logger = Logger(sink=sys.stderr)
```

(cell 3)
```
logger.log("a message")
```

With ipykernel 6.28.0, the log message appears under cell 3, as intended, but with 6.29.0, it appears under cell 2 instead, and subsequent messages logged using the same `logger` will always appear under cell 2.

(Note: I tested with Jupyter Notebook 7.5.0 and Python 3.12.11 on Ubuntu 24.04.)

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。