Python Параллелизм - шина CAN - PullRequest
1 голос
/ 18 июня 2020

Я нахожусь на начальных этапах разработки масштабируемой системы тестирования оборудования на основе CAN. Две основные функции тестовой системы - это регистрация всего трафика c на шине И выполнение тестовых примеров. Тестовые примеры в основном будут состоять из приема и передачи сообщений CAN при оценке содержимого полезных данных сообщения. Также будет ряд тестовых примеров, которые необходимо будет интегрировать с устройством с последовательным управлением.

Из-за важности регистрации всего CAN-трафика c Я рассматривал программу на основе параллелизма. Но я не уверен, какую форму параллелизма мне следует реализовать. Я читал о asyncIO , threading и multiprocessing . Так что я хорошо отношусь к каждому из них.

Я также использую библиотеку python -can, которая, кажется, имеет встроенный asyncIO, так что это наводит меня на мысль, что с asyncIO все должно быть хорошо. Меня беспокоит, что мне, возможно, придется установить sh какую-то буферизацию с помощью asyncIO, если сопрограмма тестового примера не обрабатывается достаточно быстро. Скорость автобуса 500кб. На CAN-шине 2 модуля. Самая высокая частота сообщений составляет 20 мс. Я полагаю, этого достаточно для asyncIO, чтобы запустить 2 сопрограммы. Меня также волнует масштабируемость.

Верны ли мои предположения? Должно ли быть нормально использовать asyncIO?

Любой вклад приветствуется.

1 Ответ

1 голос
/ 18 июня 2020

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

Моя последняя рекомендация - пока придерживаться asyncIO и как только у вас будет прототип вашего проекта, вы можете попробовать включить многопроцессорность и многопроцессорность и посмотреть, заметите ли вы ускорение. Существуют такие модули, как timeit, которые идеально подходят для этой цели. Если вы выбрали использование потоковой передачи с asyncIO, есть несколько очень полезных методов события l oop, которые хорошо взаимодействуют с потоками. См. Ссылку: https://docs.python.org/3/library/asyncio-dev.html#asyncio -многопоточность

Удачи!

...