2016-06-13 3 views
0

В моем текущем алгоритме я взаимодействую с роботом. Робот запускает мастер ROS, который публикует все данные. Мой компьютер, на котором работает алгоритм, подключен к мастеру ROS и управляет роботом.Переменная модуля Python как центральное хранилище для совместного использования данных и доступа внутри потоков

Расчеты алгоритма основаны на текущем состоянии робота (который будет опубликован через ROS). Для этого случая необходимо, всегда имея текущее состояние робота. Однако одновременно мой алгоритм должен постоянно принимать решения на основе текущего состояния робота. Поскольку мне нужно делать некоторые вещи параллельно, я думал об использовании потоков.

Моя идея заключалась в следующем

У меня есть центральное хранилище (в основном питон модуль) «ВАР», который содержит только различные виды переменных, среди прочего, текущего состояния робота. Моя идея состоит в том, чтобы обновить эти переменные из ROS, поэтому у меня всегда есть обновленные данные в этих переменных, и я могу выполнять мои вычисления на основе этих центральных хранимых переменных.

Мой вопрос

  • Что вы думаете о моей основной структуре?
  • Безопасно ли использовать переменные модуля python в потоках?



Спасибо за любые советы.

+0

Я бы использовал класс доски для обмена информацией между потоками – Netwave

ответ

0

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

Основные проблемы, которые я видел с конструкциями, как это:

  • Беспорядок. Всегда есть одна переменная, которая не имеет хорошего имени, и вы хотите использовать ее в двух модулях. В этой настройке он попадает в модуль vars, что затрудняет понимание.
  • Собственность. В этой настройке любой модуль может изменять любую переменную. Если вам нужно отлаживать, то может быть очень сложно понять, кто сделал это изменение и почему.
  • Трудно проверить. Когда вы пишете тесты (и вы, вероятно, должны их написать), вам нужно настроить весь этот большой модуль, который может стать сложным.

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

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

Также позаботьтесь о блокировке глобального интерпретатора в python (GIL). Вы не можете получить параллелизм, которого вы ожидаете.

Опять же, все это имеет смысл, если у вас несколько более крупная установка или та, которую вы хотите сохранить дольше. Для прототипов и экспериментов предложенная вами установка должна работать нормально.