我的脚本执行以下操作:
-
打开一个串口并从中读取信息
-
将上述信息传递给另一个二进制文件,以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
,反之亦然然后首先关闭线程或线程,然后关闭两个进程 .