gpt4 book ai didi

python - 使用 pyudev 的监视器终止 USBdetector 线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:20 25 4
gpt4 key购买 nike

我有一个在远程设备上运行的 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。我想在另一个线程结束时终止线程。如果我为我的主线程发出退出命令,这个 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 循环中,等待终止为真。它简单且有效,但是仍然想知道是否有办法在 iter() 循环中踢出 for device。

最佳答案

这可能不是您正在寻找的直接答案。为什么不使用异步回调而不是通过轮询同步监控 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() 实现线程锁定并访问和编辑时间变量,并且每秒只接受新的回调。希望对您有所帮助,抱歉回复晚了。

关于python - 使用 pyudev 的监视器终止 USBdetector 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52098616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com