Я хотел бы запретить запуск нескольких экземпляров одной и той же длинной командной строки python script, и я хотел бы, чтобы новый экземпляр мог отправлять данные в исходный экземпляр до новый экземпляр совершает самоубийство. Как я могу сделать это кросс-платформенным способом?
В частности, я хотел бы включить следующее поведение:
-
foo.py
"запускается из командной строки, и он будет работать в течение длительного времени - дней или недель, пока компьютер не перезагрузится или родительский процесс не убьет его. - каждые несколько минут снова запускается тот же script, но с различными параметрами командной строки
- при запуске script должен увидеть, запущены ли какие-либо другие экземпляры.
- Если выполняются другие экземпляры, то экземпляр # 2 должен отправить свои параметры командной строки в экземпляр # 1, а затем экземпляр # 2 должен выйти.
- instance # 1, если он получает параметры командной строки из другого script, должен развернуть новый поток и (используя параметры командной строки, отправленные на шаге выше), начнет выполнять работу, которая прошла экземпляр # 2 выполнить.
Итак, я ищу две вещи: как программа python знает, что другой экземпляр сам запущен, а затем как одна из команд командной строки python взаимодействует с другой?
Чтобы сделать это более сложным, тот же самый script должен работать как в Windows, так и в Linux, поэтому в идеале решение будет использовать только стандартную библиотеку Python, а не любые вызовы, специфичные для ОС. Хотя если мне нужно иметь кодировку Windows и кодировку * nix (и большой оператор if
в моем коде, чтобы выбрать тот или иной), это нормально, если решение "того же кода" невозможно.
Я понимаю, что я мог бы, вероятно, разработать подход, основанный на файлах (например, экземпляр # 1 просматривает каталог для изменений, и каждый экземпляр бросает файл в этот каталог, когда он хочет выполнять работу), но я немного обеспокоен уборкой эти файлы после неправильного завершения работы машины. В идеале я бы мог использовать решение в памяти. Но снова я гибкий, если подход с постоянным файлом - единственный способ сделать это, я открыт для этого варианта.
Более подробно: я пытаюсь это сделать, потому что наши серверы используют средство мониторинга, которое поддерживает запуск сценариев python для сбора данных мониторинга (например, результаты запроса базы данных или вызова веб-службы), который затем отслеживает инструмент мониторинга использовать. Некоторые из этих сценариев очень дороги для запуска, но дешево для запуска после запуска (например, создание соединения с БД и выполнение запроса). Поэтому мы решили сохранить их в бесконечном цикле до тех пор, пока родительский процесс не убьет их.
Это отлично работает, но на более крупных серверах может работать 100 экземпляров одного и того же script, даже если они собирают данные только каждые 20 минут каждый. Это приводит к хаосу с ОЗУ, ограничениями на соединение с БД и т.д. Мы хотим перейти от 100 процессов с 1 потоком к одному процессу с 100 потоками, каждый из которых выполняет работу, ранее выполнявшуюся script.
Но изменение способа запуска скриптов средствами мониторинга невозможно. Нам нужно поддерживать одинаковый вызов (запустить процесс с разными параметрами командной строки), но изменить скрипты, чтобы распознать, что другой активен, и "новый" script отправить свои рабочие инструкции (из параметров командной строки ) к "старому" script.
Кстати, это не то, что я хочу сделать на основе one- script. Вместо этого я хочу скомпоновать это поведение в библиотеку, которую могут использовать многие авторы script. Моя цель - включить авторов script для написания простых однопоточных скриптов, которые не знают о проблемах с несколькими экземплярами и обрабатывать многопоточное и однострочное под крышкой.