首頁 >後端開發 >Python教學 >如何優雅且強制地終止 Python 中正在運行的執行緒?

如何優雅且強制地終止 Python 中正在運行的執行緒?

Linda Hamilton
Linda Hamilton原創
2024-12-25 15:32:24859瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn