xenon
@xenon
Too drunk to fsck

Как просто сделать неблокируемое взаимодействие с питоновским процессом?

Есть программа на питоне, она долго в цикле обрабатывает один файл из множества строк. Работает она в один процесс, последовательно. И хочется иногда как-то с ней связаться и узнать как дела (сколько строк обработано, сколько она уже времени работает, какая скорость, что сейчас обрабатывает итд).

Клиентом будет либо сама эта программа (при вызове с особым ключом полезет куда-нибудь в особый файл запишет команду "дай мне статистику", прочитает ответ и распечатает), либо может даже вообще /bin/cat /tmp/myfile.sock (было бы круто). Хотелось бы двунаправленную коммуникацию, чтобы можно было в будущем и другие команды отправлять, но и однонаправленная интересна, если она проще.

Вот что-то подобное хочется (с точки зрения юзера) получить на выходе:

# терминал 1
$ ./myscript.py < very_long_file.txt
started....

# терминал 2 (та же машина, тот же юзер)
$ ./myscript.py --stats
processed 123 lines


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

Нельзя ли все это сделать без форков и тредов, просто в цикле проверять, и если кто-то хочет статистику каким-то способом (может быть через FIFO или файловый или TCP socket, или через HTTP запрос - смотря через что мы это можем) - то дать ему статистику и продолжить работу?
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 3
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Самое простое - писать во временный файл.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Существует много техник взаимодействия между процессами. Основное ключевое слово для поиска - IPC (Inter process communications). Там дальше надо выйти за границы Питона потому что эти техники немного разные для Windows/Linux. Некоторые похожие (Network Sockets).

Если надо просто вести учет строк в PIPE между процессами то можно так

bzip2 -d -k -c very_long_file.txt.bz2 | pv -l > /dev/null
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Пусть программа пишет в stdout или в stderr текущее положение дел.
Ну или в отдельный временный файл. OpenVPN так делает, например.

Особенность такого подхода в том, что программа сама решает, когда обновить эту инфу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы