質問: "%s%s\n" % (result, line) finally: signal.alarm(0) return result ``` 上記の signal.alarm(...) は time.sleep(...) にすればいいと思ったのですが signal.signal(... , ...) はどのように書き換えればいいのでしょうか? (特にsignal.SIGALRMの箇所) こちらを読んでみたのですがいまいちわかりませんでした。 詳しい方ご教授願います
回答: まったく同じ処理は実現できないと思います。 基礎知識 シグナルというのは、「システム」や「プロセス」がプロセスに送ります。送られたプロセスは**何をやっていたとしても**そのシグナルを受け取って、関連付けられたハンドラの処理を実行するようになっています。無視したければ、何もしないハンドラを関連付けます。 SIGALRMというシグナルは、タイムアウトとともに設定すると、「システム」がタイムアウト時間後にシグナルを送ってくれます。 システムがWindowsの場合、対応していないので、SIGALRMは送れません。 ソースをシグナル処理に着目した動作は ・呼ばれると例外を発生する関数を定義 ・SIGALRMのハンドラにその関数を設定(signal.alarm()) ・SIGALRMの設定 (signal.signal()) 設定した時間後にSIGALRMが送られるようになる。 ・例外を捕捉するようにする(try-catch) ・時間のかかるかもしれない/終わらないかもしれない処理を実施 ★ のようになっています。 そして、この「時間のかかるかもしれない処理」を実施しているときに、 * 時間内に終われば、finallyでアラームを止めて、処理終了 * タイムアウトすれば、例外が発生するので、処理が中断される。 ということで、或る時間内にこの処理を終らせることができます。 アラームによるタイムアウトを使わない場合、ループを回して定期的に確認するなどして待ち合わせるのが一般的ですが、(★)の処理が「ブロックする」(=応答あるまで関数が帰ってこないなど)場合、その手が使えません。 何とかしたいということであれば、windowsでも他のシグナルは使えるようなので、別プロセスを立ち上げて、そこで時間を計って適切なタイミングで、シグナルを投げるなどでしょうか。