У меня есть сценарий 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 будет true. Его простое и полезное, однако все равно хотелось бы знать, есть ли способ вытащить из устройства for в цикле iter().
Это не тот прямой ответ, который вы ищете. Вместо синхронного контроля портов USB путем опроса, почему бы не использовать асинхронные обратные вызовы, как показано в следующем руководстве по мониторингу пиудева в разделе "Асинхронный мониторинг".
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(), а также получать доступ и редактировать временную переменную и принимать новые обратные вызовы каждую секунду. Надеюсь, это поможет, извините за поздний ответ.