Python - 在threading.Thread中实现stop方法

时间:2015-03-11 12:46:04

标签: multithreading python-2.7

我在我的项目中使用线程我想继承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并更改了我的代码。

0 个答案:

没有答案