0

COMポートからのログを処理してDBに送るシリアルロギングユーティリティがあります。私はプロトコルファクトリーと連携してpyserial ReaderThreadを使用しています。子プロセスから親にコピーされたスレッド

class SerialLogging(Process): 
    def __init__(self, cpath, q): 
     Process.__init__(self) 
     self.__queue = q 
     config = configparser.ConfigParser() 
     config.optionxform = str 
     config.read(cpath) 
     self.__configs = list() 
     for section in config.sections(): 
      self.__configs.append(dict(config.items(section))) 
     if len(self.__configs) <= 0: 
      return 1 

     self.__serials = list() 
     for config in self.__configs: 
      if config['status'] == 'on': 
       self.__serials.append({'thread': threaded.ReaderThread(serial.Serial(config['port'], baudrate=config['baudrate'], timeout=1), lambda config=config: PrintLines(config['device'])), 'port': config['port'], 'device': config['device'], 'baudrate' : config['baudrate']}) 

     for ser in self.__serials: 
      try: 
       ser['thread'].start() 
       ser['status'] = 'on' 
      except: 
       ser['status'] = 'off' 


    def run(self): 
     while True: 
      try: 
       message = self.__queue.get_nowait() 
       self.__queue.task_done() 
      except queue.Empty: 
       continue 
      if 'close' in message: 
       self.__disable(message.split(' ')[1]) 
       self.__queue.put('ok') 
      elif 'run' in message: 
       self.__enable(message.split(' ')[1]) 
       self.__queue.put('ok') 
      elif 'list' in message: 
       self.__queue.put(self.__list()) 
     return  

    def __disable(self, port): 
     for serial in self.__serials: 
      if serial['port'] == port and serial['status'] == 'on': 
       serial['thread'].close() 
       serial['status'] = 'off'  

    def __enable(self, port): 
     for ser in self.__serials: 
      if ser['port'] == port and ser['status'] == 'off': 
       ser['thread'] = threaded.ReaderThread(serial.Serial(ser['port'], baudrate=ser['baudrate'], timeout=1), lambda ser=ser: PrintLines(ser['device'])) 
       ser['thread'].start() 
       ser['status'] = 'on' 

    def __list(self): 
     return ['%s=%s %s' % (serial['port'], serial['device'], serial['status']) for serial in self.__serials] 

SerialLoggingクラスは別のプロセスとしてインスタンス化されます。 問題は、ReaderThreadsが何らかの形で子プロセスから親プロセスにコピーされているためです。スレッドを停止すると、子プロセスでのみ停止し、親プロセスからの情報のログを継続します。 この問題に関するご意見はありますか?あなたの助けに本当に感謝します。

+0

私は子プロセスでスレッドを作成していましたが間違っていました。 –

答えて

0

子プロセスでスレッドを作成していましたが間違っていました。

関連する問題