Мой скрипт выполняет следующие действия:
- открывает последовательный порт и считывает из него информацию
- передает вышеуказанную информацию в другой двоичный файл для предоставления информации в формате 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 , но я хочу сделать его более безопасным для выхода, поскольку этот скрипт должен работать на встроенном одноплатном компьютере.
Iхотите знать, есть ли определенный порядок, которому необходимо следовать здесь.Например, сначала закройте actisense_process
и позже analyzer_process
или наоборот, а затем сначала поток или поток, а затем два процесса.