Python執行緒退出控制

2021-09-07 04:26:45 字數 2609 閱讀 9164

ctypes模組控制線程退出

python中threading模組並沒有設計執行緒退出的機制,原因是不正常的執行緒退出可能會引發意想不到的後果。

例如:執行緒正在持有乙個必須正確釋放的關鍵資源,鎖。

執行緒建立的子執行緒,同時也將被殺掉。

管理自己的執行緒,最好的處理方式是擁有乙個請求退出標誌,這樣每個執行緒依據一定的時間間隔檢查規則,看是不是需要退出。

例如下面的**:

import threading

class

stoppablethread

(threading.thread)

:"""thread class with a stop() method. the thread itself has to check

regularly for the stopped() condition."""

def__init__

(self)

:super

(stoppablethread, self)

.__init__(

) self._stop_event = threading.event(

)def

stop

(self)

: self._stop_event.

set(

)def

stopped

(self)

:return self._stop_event.is_set(

)

這段**裡面,執行緒應該定期檢查停止標誌,在退出的時候,可以呼叫stop()函式,並且使用join()函式來等待執行緒的退出。

然而,可能會出現確實想要殺掉執行緒的情況,例如你正在封裝乙個外部庫,它會忙於長時間呼叫,而你想中斷它。

python執行緒可以丟擲異常來結束:

傳參分別是執行緒id號和退出標識

def_async_raise

(tid, exctype)

:'''raises an exception in the threads with id tid'''

ifnot inspect.isclass(exctype)

:raise typeerror(

"only types can be raised (not instances)"

) res = ctypes.pythonapi.pythreadstate_setasyncexc(tid,

ctypes.py_object(exctype)

)if res ==0:

raise valueerror(

"invalid thread id"

)elif res !=1:

# "if it returns a number greater than one, you're in trouble,

# and you should call it again with exc=null to revert the effect"

ctypes.pythonapi.pythreadstate_setasyncexc(tid,0)

raise systemerror(

"pythreadstate_setasyncexc failed"

)

如果執行緒在python直譯器外執行時,它將不會捕獲中斷,即丟擲異常後,不能對執行緒進行中斷。

簡化後,以上**可以應用在實際使用中來進行執行緒中斷,例如檢測到執行緒執行時常超過本身可以忍受的範圍。

def

_async_raise

(tid, exctype)

:"""raises the exception, performs cleanup if needed"""

tid = ctypes.c_long(tid)

ifnot inspect.isclass(exctype)

: exctype =

type

(exctype)

res = ctypes.pythonapi.pythreadstate_setasyncexc(tid, ctypes.py_object(exctype)

)if res ==0:

raise valueerror(

"invalid thread id"

)elif res !=1:

# """if it returns a number greater than one, you're in trouble,

# and you should call it again with exc=null to revert the effect"""

ctypes.pythonapi.pythreadstate_setasyncexc(tid,

none

)raise systemerror(

"pythreadstate_setasyncexc failed"

)def

stop_thread

(thread)

: _async_raise(thread.ident, systemexit)

Python 子執行緒退出孫執行緒不退出

遇到了乙個大坑!如圖,在子執行緒threadfunc退出之後,threadfunc2依舊在執行。根本不會結束 但是官方文件中說明了,只要設定了daemon不為none 就能設定子執行緒是守護執行緒,這樣執行緒退出的時候,子執行緒也會退出 如果不是 none,daemon 引數將顯式地設定該執行緒是否...

python 執行緒退出方法

fifo是常用的佇列,其一些常用的方法有 queue.qsize 返回佇列大小 queue.empty 判斷佇列是否為空 queue.full 判斷佇列是否滿了 queue.get block timeout 從佇列頭刪除並返回乙個item,block預設為true,表示當隊列為空卻去get的時候會...

控制多執行緒暫停 繼續 退出

不要使用terminate介面,可能會引起未知錯誤 配合呼叫quit和wait介面,使線 正退出 if pthread isrunning void run todo 對外提供暫停 繼續 是否暫停三個介面 暫停後如果想退出執行緒,必須先繼續執行緒才能退出 void pause void resume...