Python несколько потоков / несколько процессов для чтения последовательных портов - PullRequest
6 голосов
/ 24 ноября 2011

Я пытаюсь написать класс Python, использующий параллельную обработку / многопоточность для чтения двух последовательных портов (/ dev / ttyS1 и / dev / ttyS2).Оба эти порта работают со скоростью 19200 бод и постоянно активны.Для этой цели я использовал pySerial.

Обе операции чтения должны выполняться непрерывно и одновременно.Мне интересно, если следует использовать библиотеку потоков или потоковую библиотеку или многопроцессорную библиотеку.Я волнуюсь только из-за глобальной блокировки интерпретатора, которая не дает истинной возможности многопоточности для тяжелых операций ввода-вывода.Но если глобальная блокировка интерпретатора не влияет на меня, тогда я буду использовать модуль Threading / Thread.Однако, если это произойдет, мне нужно будет кросс-компилировать многопроцессорные библиотеки python, потому что это во встроенной системе.

Таким образом, мой код обычно имеет нить thread1 или process1 = чтение ttyS1 и запись в буфер после выполнения некоторых строковых операций над строками чтения.thread2 или process2 = чтение ttyS2 и запись в другой буфер после выполнения некоторых строковых операций над строками чтения.Другие функции и т. Д. Эти буферы используются другими частями кода.

Также для многопроцессорной обработки в python требуется несколько ядер / процессоров?

Спасибо за чтение!

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

GIL высвобождается во время операций чтения, поэтому он не должен сильно влиять на вас.Кросс-компиляция multiprocessing звучит как перебор или, по крайней мере, преждевременная оптимизация.Сохраняйте код модульным, чтобы вы могли переключаться позже, хотя.

Я верю, что производительность потоков будет зависеть от вашей ОС.Ваш пробег будет отличаться, особенно на встроенной системе.

Если у вас есть запасной час, вы можете поговорить о GIL Дэвида Бизли (PDF-слайды здесь ).Что касается высокопроизводительной многопоточности, вы захотите увидеть ее, чтобы получить неприятные подробности о том, как многопоточность, GIL и ОС могут работать вместе для снижения производительности.

1 голос
/ 24 ноября 2011

Я ни в коем случае не эксперт по этому вопросу, но я продолжаю находить, что количество дополнительных тонкостей, которые требуются при использовании threading, не стоит усилий, если вместо этого я могу распараллелить процессы.

Третий модуль, который вы не упомянули среди альтернатив, - subprocess.

РЕДАКТИРОВАТЬ по запросу OP: Вы можете добиться параллельной обработки, создав отдельные сценарии для последовательных интерфейсов. Это короткая демонстрация, предполагающая, что оба файла находятся в одном каталоге.

Файл com.py - серийный скрипт - Это просто пародия, но идея в том, что скрипт работает автономно и использует только stdin и stdout для связи с мастер-программой.

import sys

counter = 0
while True:  # The program never ends... will be killed when master is over.
    counter += 1
    sys.stdin.readline()
    sys.stdout.write('Serial from com1 is %d\n' % counter)
    sys.stdout.flush()

Файл master.py - основная программа

from subprocess import Popen, PIPE
from time import sleep

p = Popen(['python', './com.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
print "serial communication started."  # com.py is working but we moved on!
for i in range(3):
    p.stdin.write('<command-here>\n')
    print "comand sent."
    print "received : %s" % p.stdout.readline()
    sleep(1)

Наконец, это дамп ожидаемого результата:

mac@jabbar:~/Desktop$ ./master.py 
serial communication started.
comand sent.
received : Serial from com1 is 1
comand sent.
received : Serial from com1 is 2
comand sent.
received : Serial from com1 is 3

НТН!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...