クリーンにシャットダウンできるようにする必要があるサーバースクリプトがあります。通常のステートメントをテストしているときに、通常の方法では機能しないtry..except
ことに気付きました。Ctrl-C
通常、私はこのような長時間実行されるタスクをラップします
try:
...
except KeyboardInterrupt:
#close the script cleanly here
そのため、でタスクを正常にシャットダウンできますCtrl-C
。私はこれまでこれで問題に遭遇したことはありませんがCtrl-C
、この特定のスクリプトが実行されているときにヒットすると、スクリプトはキャッチせずに終了しますCtrl-C
。
初期バージョンはProcess
fromを使用して実装されましmultiprocessing
た。Thread
fromを使用してスクリプトを書き直しましたthreading
が、同じ問題があります。threading
私はこれまで何度も使用したことがありますが、multiprocessing
図書館は初めてです。Ctrl-C
いずれにせよ、私はこれまでこの行動を経験したことがありません。
通常、私は常に番兵などを実装してQueues
、Thread
インスタンスを整然と閉じますが、このスクリプトは応答なしで終了します。
signal.SIGINT
最後に、このようにオーバーライドしてみました
def handler(signal, frame):
print 'Ctrl+C'
signal.signal(signal.SIGINT, handler)
...
ここCtrl+C
で実際にキャッチされましたが、ハンドラーは実行されず、何も出力されません。
threading
/multiprocessing
アスペクトに加えて、スクリプトの一部にはC++
SWIG
オブジェクトが含まれています。それがそれと関係があるのかどうかはわかりません。OSXLionでPython2.7.2を実行しています。
だから、いくつかの質問:
- 何が起きてる?
- どうすればこれをデバッグできますか?
- 根本的な原因を理解するために何を学ぶ必要がありますか?
注意:スクリプトの内部は独自のものであるため、コード例を示すことはできません。ただし、これを自分でデバッグできるように、ポインターを喜んで受け取ります。私は、誰かが私を正しい方向に向けることができるかどうかを理解するのに十分な経験を積んでいます。
編集:C++ SWIG
奇妙な動作の原因を確認するためにインポートなどをコメントアウトし始め、ライブラリのインポートに絞り込みました。ライブラリをインポートする理由がC++ SWIG
「盗む」という考えはありCtrl-C
ますか?私は有罪の図書館の著者ではありませんが、私のSWIGの経験は限られているので、どこから始めればよいのかよくわかりません...
編集2: Windowsマシンで同じスクリプトを試したところ、Windows7ではCtrl-C
期待どおりにキャッチされました。私は実際にはOSXの部分を気にするつもりはありません、とにかくスクリプトはWindows環境で実行されます。