Самый простой способ порождать несколько экземпляров Python в одном SSH-соединении - PullRequest
0 голосов
/ 07 июня 2018

У меня есть проект, основанный на Raspberry Pi, на котором запущена последняя версия Raspbian Jessie.4 отдельных скрипта Python (которые содержат бесконечные циклы для работы нескольких шаговых двигателей, других аппаратных устройств и опроса АЦП и устройств ввода) работают одновременно в 4 отдельных соединениях SSH и обмениваются данными друг с другом через простой сервер сокетов UDP.

На данный момент все работает идеально, однако невозможно иметь 4 отдельных SSH-соединения с машиной.По сути, я ищу способ порождения 4 отдельных экземпляров Python, которые:

  1. не подпадают под действие Global Interpreter Lock
  2. Способныпередавать переменные друг другу

В настоящее время система основана на Python 2.7.Я экспериментировал с Python 3 (для asyncio) безрезультатно.Я также безуспешно пытался использовать модули multiprocessing и threading.

Мне не обязательно нужен другой скрипт Python для порождения всех 4 экземпляров;сценарий оболочки будет просто отлично.Я понимаю, что это возможно, используя os.subprocess(shell=True) или что-то в этом роде?

Спасибо, Адам

Ответы [ 2 ]

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

Сценарий bash, запускающий 4 фоновых задания, может нормально работать для этапа PoC и тестирования.Но если позже вам захочется надежно выполнить свой код дольше, чем несколько минут, вам потребуется реализовать некоторую логику супервизора.Мой совет - использовать systemd для настройки 1 контроллера и 4 рабочих служб.Таким образом, systemd будет выполнять тяжелую работу по мониторингу / перезапуску и т. Д. Ваших служб, и вы будете использовать ssh только для управления главной службой.

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

Поскольку это, кажется, решение:

У вас просто есть одно SSH-соединение с машиной, которая вызывает один сценарий:

ssh me@raspi "bash ~/caller.sh"

Этот сценарий вызовет все ваши функции:

#!/usr/bin/env bash
python script1.py &
python script2.py &
python script3.py &
python script4.py &

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

Для вашего комментария записи в стандартный вывод не подавляются;вы увидите выходные данные всех 4-х сценариев Python, смешанных в зависимости от того, как далеко проходит каждый скрипт.

...