import threading
import time
import inspect
import ctypes
def _async_raise(tid, exctype):
"""raises an exception in the threads with id tid"""
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:
# """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)
class testthread(threading.thread):
def run(self):
print("begin run the child thread")
while true:
print("sleep 1s")
time.sleep(1)
if __name__ == "__main__":
print("begin run main thread")
t = testthread()
t.start()
time.sleep(3)
stop_thread(t)
print("main thread end")
這種方法是強制殺死執行緒,但是如果執行緒中涉及獲取釋放鎖,可能會導致死鎖。
有一種更優雅的殺死執行緒的方法就是使用退出標記,這裡使用threading.event()建立乙個事件管理標記flag,這種方法是更安全的。
# encoding:utf-8import time
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, *args, **kwargs):
super(stoppablethread, self).__init__(*args, **kwargs)
self._stop_event = threading.event()
def stop(self):
self._stop_event.set()
def stopped(self):
return self._stop_event.is_set()
def run(self):
print("begin run the child thread")
while true:
print("sleep 1s")
time.sleep(1)
if self.stopped():
# 做一些必要的收尾工作
break
if __name__ == "__main__":
print("begin run main thread")
t = stoppablethread()
t.start()
time.sleep(3)
t.stop()
print("main thread end")
python殺死執行緒
源 python殺死執行緒 2009年05月13日 星期三 22 32 我曾經碰到過類似問題,研究後的結論是,問題出在python沒有殺死執行緒的api上。python對於執行緒只能去join,或者給執行緒傳送訊號來終止。但是我使用pycurl庫的時候,掛死在網路上,他就沒辦法了。我的解決方案平台相...
python殺死執行緒
python殺死執行緒 2009年05月13日 星期三 22 32 我曾經碰到過類似問題,研究後的結論是,問題出在python沒有殺死執行緒的api上。python對於執行緒只能去join,或者給執行緒傳送訊號來終止。但是我使用pycurl庫的時候,掛死在網路上,他就沒辦法了。我的解決方案平台相關了...
查詢埠的占用, 殺死執行緒
假如我bai們需要確定誰占用了我du們的zhi80埠 在windows命令列視窗下執行dao c netstat aon findstr 80 tcp 127.0.0.1 80 0.0.0.0 0 listening 2448 看到了嗎,4102埠被1653程序號為2448的程序占用,繼續執行下面命...