2017-01-20 1 views
0

Я сделал 3 кода на Python. Я использую Raspberry Piподпроцесс VS функция VS Параллельные программы в/etc/profile

  • Код 1 - Печать штрих-кодов на кнопку печати
  • Code 2 - Посылает штрихкод на сервер
  • код 3 - Работает в фоновом режиме, чтобы записать данные в случае сбоя в сети и отправить данные после входа в Интернет.

Примечание: Все эти коды работают в while(True) цикле

Теперь я должен запускать все эти 3 программы параллельно друг другу. Я прочитал около 3 вариантов у меня есть

подпроцесс - Где я импортировать коды питона в один код, используя подпроцесс() и запускать их

Использование/и т.д./профиль - Где я положил в следующем линия в конце sudo nano /etc/profile

sudo python3 (link to code1) & sudo python3 (link to code3) 

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

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

Теперь все эти 3 дают мне результаты с небольшими ошибками здесь и там время от времени. Но я хочу знать ... что является ЛУЧШИМ возможным и наиболее эффективным способом запуска нескольких программ параллельно друг другу

ответ

0

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

Вариант 2 почти такой же, но это не имеет смысла. /etc/profile is invoked only for login shells because that is its specific purpose. Вам нужна опция для запуска программы под другим пользователем. Если вы планируете перезапустить программы, почему бы не использовать один и тот же механизм для его запуска в первый раз?

Вариант 3. Если вы запустите приложение в разных функциях в одном процессе - слишком много головной боли. И у вас есть проблемы со временем - какая функция работает в этот момент. Вы можете использовать многопоточность, но это может быть слишком сложно для вашего варианта использования. Хотя, если второе приложение просто отправляет сетевые запросы, это вполне приемлемое решение. код 2 и 3 будет одним и тем же приложением. Запустите его во втором потоке - он будет собирать данные в локальной базе данных sqlite и отправлять сообщения, которые не помечены как отправленные (эта же идея применяется для варианта 1).

+0

Что делать, если я запускаю эти 3 программы, используя определения функций ИЛИ используя потоки ... И моя четвертая программа, которая просто записывает время и перезапускает rpi, как только она набирает 3 часа, я запускаю эту программу с использованием/etc/profile. AS, мне нужно запустить всю эту операцию при загрузке RPi. – shantanu

+0

Используйте superisord для обработки всех процессов. Это дает вам все, что вам нужно. Вы можете запустить его при загрузке (http://serverfault.com/q/96499/98756). Но не используйте '/ etc/profile' - это для чего-то другого. И ваше приложение не будет перезагружаться, если вы не входите в систему - например, после перезапуска из-за сбоя питания. – warvariuc

+0

Мне нужно, чтобы мои приложения перезапускались после загрузки rpi. Думаю, мне нужно сделать фиджинг с аутологией? – shantanu