Проверьте, не произошла ли инициализация скрученного сервиса с использованием twistd с ошибкой

С помощью twistd Система плагинов запускаю Twisted приложения. С помощью этого SO-ответа я реализовал PID-файл (в который записан ID процесса), чтобы определить, был ли демон успешно запущен или нет.

Мониторинг витого демона (запущенного или еще не запущенного) осуществляется собственным приложением (ОС), которое просто проверяет, существует ли файл PID, и считывает его содержимое, чтобы узнать, существует ли активный процесс с этим PID.

Все идет нормально. Скрученные плагины, которые я написал, создают объект Service, который принимает объект Driver в качестве аргумента. Все аппаратные операции содержатся в этом классе драйверов.

Внутренние детали того, что Сервис думает, выходят за рамки вопроса. Но просто чтобы уточнить, было бы много подобных Сервисов, которые взаимодействуют друг с другом по сети.

Теперь предположим, что драйвер взаимодействует с оборудованием, используя UART/ последовательную связь. Целевое оборудование всегда перечисляет себя с фиксированным именем, которое используется в драйвере для распознавания (физической) доступности оборудования.

В определенных ситуациях аппаратное обеспечение может (физически) не подключаться к системе. Поэтому я хочу реализовать способ определения, подключено ли оборудование на самом деле или нет.

Вот минимальный витой код плагина

class Options(usage.Options):
    optFlags = [
        ['emulate', 'e', 'Emulate the laser'],
        ]

class HardwareServiceMaker(object):
      implements(service.IServiceMaker, IPlugin)
      tapname = "test.hw"
      options = Options

      def makeService(self, options):

        from hardwaredrivers import *
        driver = HardwareDriver()

        service = HarwareService(driver)
        service.setPIDFile('test.hw.txt')

        return service

Вот сервис и драйвер

class HardwareService(twisted.application.service.Service):
    def __init__(self,driver)
        self._driver = driver
    def do_something(self):
        self._driver.control_something()

class HardwareDriver():
    def __init__(self):
        # Lets say getAllSerials() returns a list of all available serial connections
        allSerials = getAllSerials()
        for serial in allSerials:
            if 'TARGET_HARDWARE' in serial:
                self.ser = serial.Serial()
                self.ser.open()

    def control_something():
        self.ser.write('ON\n')

Из приведенного выше кода видно, что если нет аппаратного устройства, которое перечисляет как TARGET_HARDWARE, то self.ser является None, Что приводит к ошибочным операциям, когда control_something() называется.

Я хочу предотвратить это, или точнее сообщить пользователю, что произошла аппаратная ошибка во время запуска плагина (следовательно, службы, а следовательно, драйвера) с помощью twistd,

0 ответов

Другие вопросы по тегам