Плюсы и минусы использования общих Value / Array vs Queue / Pipe в многопроцессорной обработке Python - PullRequest
1 голос
/ 04 февраля 2020

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

Я понимаю, что ответ может варьироваться в зависимости от приложения, поэтому я объясню, что такое мое приложение.

Я создал планировщик в моем основном процессе, который управляет несколькими процессами. выполнить (эти процессы запускаются раньше, l oop непрерывно и выполнять код, когда мой планировщик поднимает флаг в общем значении). Используя счетчики в моем планировщике, я могу иметь несколько процессов, выполняющих код на разных частотах (в диапазоне 100–400 Гц), и все они идеально синхронизированы.

Например, один процесс выполняет динамический c модель квадрокоптера (ода) с частотой 400 Гц и обновляет состояние квадрокоптера. Мои другие процессы (генерация команд и генерация траектории) работают на более низких частотах (200 Гц и 100 Гц), но требуют обновленного состояния. В настоящее время я вижу 2 способа сделать это:

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

  • С общим значением / массивом: мне понадобится только один массив для состояния, мой процесс динамики будет записывать в него, а мой другие процессы будут читать из него. Мне, вероятно, придется реализовать блокировки (могу ли я прочитать общее значение / массив из 2 процессов одновременно без блокировки?). Это еще не было проверено, но, вероятно, будет чище.

Я читал, что использование разделяемой памяти - это плохая практика (почему это так?). Да, я буду обновлять его на 400 Гц и читать на 200 и 100 Гц, но это не будет такой большой массив (10-i sh float или double). Тем не менее, я также читал, что разделяемая память быстрее, чем Pipes / Queues, и я хотел бы расставить приоритеты по скорости в своем коде, если использование разделяемой памяти не является большой проблемой.

Имейте в виду, Мне нужно будет отправлять сгенерированные команды в мой динамический процесс (еще 5-i sh с плавающей точкой) и генерировать желаемые состояния для моего процесса управления (еще 10-i sh с плавающей точкой), так что это либо более общие больше труб.

Поэтому мне было интересно, каковы преимущества и недостатки обоих методов. Спасибо!

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