python中殺死執行緒

2021-10-03 20:21:02 字數 2207 閱讀 7545

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-8

import 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的程序占用,繼續執行下面命...