Python - быстрый расчет и медленная последовательная запись: многопоточность или многопроцессорность. - PullRequest
0 голосов
/ 27 июня 2018

У меня есть проект робототехники, в основном проблема с отслеживанием пути. В ПК алгоритм генерации ссылок реализован в Python3.65. Алгоритм берет данные GPS внутри помещений и использует эти постоянно обновляемые данные для расчета контрольного пути для автомобиля-робота. Конечно, алгоритм работает в в то время как True: .... фреймворк. Алгоритм может работать хорошо, только если частота дискретизации достаточно высока, скажем, 0,001 с. Однако проблема заключается в том, что после вычисления эталонного пути информация о пути должна быть записана в последовательный порт ПК побайтно через Serial.write (). Эта функция serial.write () по-прежнему является циклом for. И этот процесс записи очень медленный (более 0,02 с для 16 байтов). Если цикл for включен в структуру while True: что-то вроде:


while True:
  Data = Ref_generation()
  Bytes_Full = Float_2_Bytes_List(Data)
  for ele in Bytes_Full:
    Serial.write(ele)  # VERY SLOW!!!
  sleep(0.001)

Тогда, Данные не могут быть правильно рассчитаны, так как период цикла намного длиннее, чем 0,001 с.

В двух словах, как я могу отделить алгоритм быстрого вычисления от медленного serial.wtite ()? Я пробовал многопоточность, но не работает.

Любая помощь будет оценена, большое спасибо!

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

У меня была похожая проблема, я использовал поток демона для запуска части последовательной связи. Поэтому попробуйте запустить последовательную связь в потоке демона, который будет работать в фоновом режиме хост-процесса. Это позволит вашей программе запускать задачи независимо от времени ожидания, необходимого для последовательной связи. Таким образом, вы можете отделить алгоритм быстрого вычисления от медленного serial.wtite ().

Подробнее о нити демона можно узнать здесь . Далее, чтобы избежать задержки буфера, вы можете использовать reset_output_buffer() от pySerial.

0 голосов
/ 27 июня 2018

Вам не нужно использовать несколько ядер процессора, все, что вам нужно, это ждать для последовательного порта ... Ваш процессор будет простаивать, ждать ... Нерест новые потоки / процессы просто ждут это пустая трата ...

Вот почему вы должны попытаться использовать какое-то решение асинхронного ввода-вывода.

Например, используйте https://github.com/pyserial/pyserial-asyncio или https://twistedmatrix.com/documents/16.1.0/api/twisted.internet.serialport.SerialPort.html

Эти асинхронные структуры позволяют вам регистрировать события и автоматически вызывать вашу функцию после их завершения, все в одном потоке / процессе .

Они также позволяют вам планировать события в нужное вам время.

...