检查使用twistd初始化扭曲服务是否因错误而失败

时间:2017-08-07 15:56:45

标签: python asynchronous twisted twistd

使用twistd插件系统,我启动了Twisted应用程序。在SO answer的帮助下,我实现了一个PID文件(将进程ID写入其中)以确定守护程序是否已成功启动。

对扭曲守护程序(已启动或尚未启动)的监视由本机(OS)应用程序完成,该应用程序仅检查PID文件是否存在并读取内容以查看是否存在具有该PID的活动进程。

到目前为止一切顺利。我编写的扭曲插件创建了一个服务对象,该对象接受驱动程序对象作为参数。所有特定于硬件的操作都包含在驱动程序类中。

我认为服务的内部细节超出了问题的范围。但只是为了澄清会有很多服务,就像这些通过网络互相交流。

现在,请考虑驱动程序使用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.serNone。这会在调用control_something()时导致错误操作。

我希望防止这种情况发生,或者更准确地提示用户在使用twistd启动插件(因此服务,因此是驱动程序)时出现硬件错误。

0 个答案:

没有答案