11

次のコードを使用してスレッドを開始します。

t = thread.start_new_thread(myfunction)

別のスレッドからスレッドを強制終了するにはどうすればよいですかt。つまり、基本的にコードの観点から言えば、私はこのようなことができるようになりたいと思っています。

t.kill()

Python2.4を使用していることに注意してください。

4

3 に答える 3

27

Pythonでは、スレッドを強制終了することはできません。

スレッド(!)が本当に必要ない場合は、スレッドパッケージ(http://docs.python.org/2/library/threading.html)を使用する代わりに、マルチプロセッシングを使用することができます。パッケージ(http://docs.python.org/2/library/multiprocessing.html)。ここで、プロセスを強制終了するには、次のメソッドを呼び出すだけです。

yourProcess.terminate()  # kill the process!

Pythonはプロセスを強制終了します(UnixではSIGTERMシグナルを介して、WindowsではTerminateProcess()呼び出しを介して)。キューまたはパイプを使用するときは注意して使用してください。(キュー/パイプ内のデータが破損する可能性があります)

multiprocessing.Eventmultiprocessing.Semaphoreは、それぞれthreading.Eventthreading.Semaphoreとまったく同じように機能することに注意してください。実際、最初のものは後者のクローンです。

本当にスレッドを使用する必要がある場合、スレッドを直接強制終了する方法はありません。ただし、できることは「デーモンスレッド」を使用することです。実際、Pythonでは、スレッドにデーモンのフラグを立てることができます。

yourThread.daemon = True  # set the Thread as a "daemon thread"

デーモン以外の有効なスレッドが残っていない場合、メインプログラムは終了します。つまり、メインスレッド(もちろん、デーモン以外のスレッド)が操作を終了すると、デーモンスレッドがまだ動作している場合でも、プログラムは終了します。

start()メソッドを呼び出す前に、スレッドをデーモンとして設定する必要があることに注意してください。

もちろん、マルチプロセッシングでもデーモンを使用できますし、使用する必要があります。ここで、メインプロセスが終了すると、すべてのデーモン子プロセスを終了しようとします。

最後に、sys.exit()os.kill()は選択肢ではないことに注意してください。

于 2013-03-03T12:47:25.283 に答える
10

スレッドがPythonコードの実行でビジー状態の場合、それを強制終了できないことよりも大きな問題があります。GILは、他のスレッドが強制終了を実行するために使用する命令を実行することさえ防止します。(少し調べてみると、通訳者が定期的にGILをリリースしていることがわかったので、前のステートメントは偽物です。ただし、残りのコメントは有効です。)

スレッドは協調的に作成する必要があります。つまり、メインスレッドがワーカースレッドに自発的に終了するように指示するために使用できるセマフォなどのシグナリングオブジェクトを定期的にチェックインする必要があります。

while not sema.acquire(False):
    # Do a small portion of work…

また:

for item in work:
    # Keep working…
        # Somewhere deep in the bowels…
        if sema.acquire(False):
            thread.exit()
于 2012-07-11T11:46:18.640 に答える
7

別のスレッドからスレッドを強制終了することはできません。他のスレッドに終了するように通知する必要があります。また、「シグナル」とは、signal関数を使用することを意味するのではなく、スレッド間の通信を調整する必要があることを意味します。

于 2012-07-11T11:27:52.763 に答える