我的脚本执行以下操作:

  • 打开一个串口并从中读取信息

  • 将上述信息传递给另一个二进制文件,以json格式提供信息

我使用 ReaderThread 类继承 threading.Thread 接收流以提供非阻塞实现

代码细分

我创建了两个进程来执行 actisense -r /dev/ttyUSB0 | analyzer -json

actisense_process = Popen(['actisense-serial', '-r', '/dev/ttyUSB0'],stdout=PIPE)

analyzer_process = Popen(['analyzer', '-json'],stdin=actisense_process.stdout, stdout=PIPE, stderr=PIPE)

我创建了一个 ReaderThread 如下:

class ReaderThread(threading.Thread):

     def __init__(self, stream):
         threading.Thread.__init__(self)
         self.stream = stream

     def run(self):
         while True:
             line = self.stream.readline().decode('utf-8')
             if len(line) == 0:
                 break
             try:
                 n2k_dict = json.loads(line)
                 print(n2k_dict)
             except Exception as e:
                 raise(e)

创建了一个 main 函数:

def main():
    reader = ReaderThread(analyzer_process.stdout)
    try:
        reader.start()

        analyzer_process.wait()
        reader.join()
    except Exception as e:
        # usually if user presses `CTRL+C` it should safely be exited
        reader.close()
        os.kill(os.getpid(analyzer_process.pid), signal.SIGTERM)
        os.kill(os.getpid(actisense_process.pid), signal.SIGTERM)

当前按下CTRL C时脚本会关闭但我希望退出更安全,因为这个脚本需要在嵌入式单板计算机上运行 .

我想知道是否需要遵循特定的顺序 . 例如 . 首先关闭 actisense_process ,然后关闭 analyzer_process ,反之亦然然后首先关闭线程或线程,然后关闭两个进程 .