使用来自pyudev的监视器终止USBdetector线程

时间:2018-08-30 13:44:05

标签: python linux multithreading pyudev

我有一个在远程设备上运行的python脚本。将创建两个不同的线程。创建第一个线程以监视与设备的USB连接。

class USBDetector(threading.Thread):
    ''' Monitor udev for detection of usb '''

    def run(self):
        ''' Runs the actual loop to detect the events '''
        self.context = pyudev.Context()
        self.monitor = pyudev.Monitor.from_netlink(self.context)
        self.monitor.filter_by(subsystem='usb')
        self.monitor.start()
        for device in iter(self.monitor.poll, None):
            if device.action == 'add':
                # some action to run on insertion of usb

如果全局变量状态更改,我尝试插入break语句。但这没有用。像

if TERMINATE == True:
    break

我看着https://pyudev.readthedocs.io/en/latest/api/pyudev.html,通过阅读它看起来像这段代码

for device in iter(self.monitor.poll, None):
            if device.action == 'add':
            # some function to run on insertion of usb

是一个无限循环,除非插入了超时而不是None。我想在其他线程结束时杀死该线程。如果我为我的主线程提供quit命令,则该usbdetector会一直运行。关于如何阻止它的任何建议?

(更新)

嘿,

抱歉,我目前采用的是技术含量较低的解决方案。

如果有人知道如何在无需第二个循环的情况下突破for循环,请告诉我

def run(self):
        ''' Runs the actual loop to detect the events '''
        global terminate
        self.rmmod_Module()
        self.context = pyudev.Context()
        self.monitor = pyudev.Monitor.from_netlink(self.context)
        self.monitor.filter_by(subsystem='usb')
        self.monitor.start()
        count = 0
        while not terminate:
            count = count + 1
            print count
            for device in iter(partial(self.monitor.poll, 3), None):
                if device.action == 'add':
                     # some function to run on insertion of usb

很明显,我有一个for循环嵌套在while循环中,等待terminate为真。它简单而有效,但是仍然想知道是否有办法在iter()循环中将for设备踢出。

1 个答案:

答案 0 :(得分:1)

这可能不是您要找的直接答案。为什么不使用异步回调,而不要通过轮询来同步监视USB端口,如以下pyudev monitoring device guide下“异步监视”部分所述。

monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by('block')
def log_event(action, device):
   if 'ID_FS_TYPE' in device:
       with open('filesystems.log', 'a+') as stream:
           print('{0} - {1}'.format(action, device.get('ID_FS_LABEL')), file=stream)

observer = pyudev.MonitorObserver(monitor, log_event)
observer.start()

从代码段中,您可能会收到一个USB设备操作的多个回调,因为它可能会将单个USB设备识别为多个设备。现在将所有内容放在一起,您可以执行以下操作。

class USBDetector():
''' Monitor udev for detection of usb '''

def run(self):
    ''' Runs the actual loop to detect the events '''
    self.context = pyudev.Context()
    self.monitor = pyudev.Monitor.from_netlink(self.context)
    self.monitor.filter_by(subsystem='usb')
    self.observer = pyudev.MonitorObserver(self.monitor, self.usbDeviceEventHandler)
    self.observer.start()

def usbDeviceEventHandler(self, action, device):
    if device.action == 'add':
       # some function to run on insertion of usb

您可能会为一个usb操作获得多个回调,因此可以使用Thread.lock()来实现线程锁定以及访问和编辑时间变量,并且每秒仅接受新的回调。希望能对您有所帮助,对不起您的答复。