Pythonのシグナルハンドラでprintを呼ぶのは安全か?
Is it safe to call print in a Python signal handler?
PythonにはCレベルのシグナルハンドラとユーザー定義のPythonシグナルハンドラの2つがあり、後者はインタプリタが安全な状態で呼ばれるため、Cの制限は適用されない。しかし、シグナルハンドラは再入可能であり、print実行中に再入するとRuntimeErrorが発生してクラッシュする可能性がある。実際に50回のシグナル送信で再現し、極端な状況下でのリスクを実証した。
極端な状況下では、シグナルハンドラ内でprintを呼ぶとプログラムがクラッシュする可能性があります。
HNでの議論
35- nine_k
POSIXシグナルは設計自体が壊れているんだよ、残念ながら: https://lwn.net/Articles/414618/ Pythonだろうがなんだろうが、シグナルハンドラの中で安全にできることはほぼ何もない。
- IgorPartola
本当に面白いのは、シグナル処理とスレッドを混ぜることだ。特にLinuxではね。簡単な方法が1つと、少なくとも1つの落とし穴を含む方法が1000通りくらいある。
- jrumbut
著者はこの問題の重要性を過小評価していると思う。誰でも簡単に、この例に帰着するコードを書く状況を想像できる。必要なのは、シグナルの洪水とprint文だけだ。プログラムがシグナルを生成するなら、意図せず洪水を引き起こす可能性がある。ハンドラにprint文を置けば、この結果が得られる。それほど驚くことではないが、知っておくのは良いことだ。
- Uptrenda
そして、これをイベントループや複数のOS、Pythonのバージョンと組み合わせると、さらに難しくなる。誤解しないでほしい: Pythonは大好きだ。でも、シャットダウンやクリーンアップはかなり面倒だ。もし誰かが(良い)ライブラリを作ってくれたら、おそらくかなり人気が出るだろう。
- charcircuit
2026年になってもこれが問題だなんて、理解できない。シグナルは新しいスレッド経由で受け取るべきで、そうすればシグナルに関する複雑さはすべて解決するはずだ。現在のやり方が安全にできることに関して極めて限定的だということは、誰もが知っている。現在実行中の処理を一時停止して、どこか別の場所で追加のコードを実行するというこの全体の仕組みは、良いアイデアではなかったことが判明した。