我在我的项目中使用线程我想继承threading.Thread并在那里实现stop方法,所以我可以继承这个类。看看这个 -
class MyThread(threading.Thread):
__metaclass__ = ABCMeta
def run(self):
try:
self.code()
except MyThread.__StopThreadException:
print "thread stopped."
@abstractmethod
def code(self):
pass
def stop(self):
tid = self.get_id()
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid,
ctypes.py_object(MyThread.__StopThreadException))
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
class __StopThreadException(Exception):
"""The exception I raise to stop the sniffing"""
pass
def get_id(self):
for tid, tobj in threading._active.items():
if tobj is self:
return tid
class SniffThread(MyThread):
def code(self):
sniff(prn=self.prn)
def prn(self, pkt):
print "got packet"
t = SniffThread()
t.start()
time.sleep(10)
t.stop()
它不起作用,因为主线程中引发了StopThreadException
,我需要找到一种方法在SniffThread
中引发它。你有更好的方法来实现stop方法吗?我需要这样做,因为我使用阻塞函数,我需要一种方法来停止线程。我知道我可以使用嗅探功能的lfilter
并保留一个标志,但我不想这样做。我不想这样做,因为它只适用于scapy,我想创建一个抽象类,可以使用适用于任何线程的stop方法继承,解决方案需要在MyThread类中。
编辑:我看了here并更改了我的代码。