8

Pythonスレッドを取り巻くルールとUnixシグナルの処理方法は何ですか?

KeyboardInterruptPythonランタイムによってトリガーされますがSIGINT、Pythonランタイムによって内部的に処理される、は別の方法で処理されますか?

4

2 に答える 2

9

まず、モジュールを使用してシグナルハンドラーを設定する場合signalは、メインスレッドでシグナルハンドラーを作成する必要があります。別のスレッドで作成しようとすると、例外が発生します。

関数を介して登録されたシグナルハンドラーsignal.signal()は、常にメインスレッドで呼び出されます。スレッドへのシグナルの送信をサポートするアーキテクチャでは、Cレベルでは、Pythonランタイムはスレッド上のすべてのシグナルを無視し、メインスレッドにシグナルハンドラーがあり、Pythonコードシグナルハンドラーにディスパッチするために使用します。

threadモジュールのドキュメントには、すべてのUnixシステムで使用できるモジュールがない限り、KeyboardInterrupt例外(通常はによってトリガーされる)を任意のスレッドに配信SIGINTできると記載されています。その場合、メインスレッドに配信されます。がないシステムを使用している場合は、スレッドをキャッチして呼び出し、メインスレッドで再レイズする必要があります。signalsignalKeyboardInterruptthread.interrupt_main()

詳細については、threadおよびsignalモジュールのPythonドキュメントを参照してください。

于 2009-07-27T16:21:02.707 に答える
4

signalドキュメントから:

シグナルとスレッドの両方が同じプログラムで使用される場合は、注意が必要です。シグナルとスレッドを同時に使用する際に覚えておくべき基本的なことは、常に実行signal()のメインスレッドで操作を実行することです。どのスレッドでも、、、、、または;alarm()を実行できます。メインスレッドのみが新しいシグナルハンドラーを設定でき、メインスレッドはシグナルを受信する唯一のスレッドになります(これは、基になるスレッドの実装が個々のスレッドへのシグナルの送信をサポートしている場合でも、Pythonシグナルモジュールによって強制されます)。これは、シグナルをスレッド間通信の手段として使用できないことを意味します。代わりにロックを使用してください。getsignal()pause()setitimer()getitimer()

于 2009-07-27T16:11:52.040 に答える