ホームページ > バックエンド開発 > Python チュートリアル > Python で実行中のスレッドを適切かつ強制的に終了するにはどうすればよいですか?

Python で実行中のスレッドを適切かつ強制的に終了するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-25 15:32:24
オリジナル
858 人が閲覧しました

How Can I Gracefully and Forcefully Terminate a Running Thread in Python?

実行中のスレッドを終了する方法

背景

一般的にはスレッドを正常に終了するように要求することが望ましいですが、突然の終了が必要な状況もあります。 。この記事では、スレッドがそのように設計されていない場合でもスレッドを終了する方法について説明します。

正常な終了

推奨されるアプローチは、スレッドが定期的にチェックしてスレッドを終了する必要があるかどうかを判断する停止フラグを使用することです。 。これにより、スレッドは終了前にリソースを解放し、クリーンアップを実行できるようになります。

import threading

class StoppableThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._stop_event = threading.Event()

    def stop(self):
        self._stop_event.set()

    def stopped(self):
        return self._stop_event.is_set()
ログイン後にコピー

強制終了

まれに、スレッドを強制的に終了する必要がある場合があります。これは、_async_raise 関数を使用して実現できます。

def _async_raise(tid, exctype):
    if not inspect.isclass(exctype):
        raise TypeError("Only types can be raised (not instances)")
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid),
                                                     ctypes.py_object(exctype))
    if res == 0:
        raise ValueError("invalid thread id")
    elif res != 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), None)
        raise SystemError("PyThreadState_SetAsyncExc failed")

class ThreadWithExc(threading.Thread):
    def raise_exc(self, exctype):
        _async_raise(self._get_my_tid(), exctype)
ログイン後にコピー

警告

強制終了すると、リソースが不安定な状態になる可能性があることに注意してください。このオプションは、正常な終了が利用できない場合、またはスレッドがプログラムをアクティブにブロックしている場合にのみ使用してください。

以上がPython で実行中のスレッドを適切かつ強制的に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート