Информация об изменениях

Сообщение Re[16]: Убунта от 25.12.2019 11:11

Изменено 26.12.2019 7:32 netch80

Re[16]: Убунта
Здравствуйте, IID, Вы писали:

IID>С проблемами он работает, причём с огромными.

IID>Простейший пример — надо в дочернем процессе запустить bash и скармливать туда команды, получая выхлоп незамедлительно.

Ну простейшим это сложно назвать (реально, да, бывают похожие случаи, но 1/1000). Но предположим.

IID>Пока команда выполняется быстро — особых проблем нет. Но! Команда может быть "долгоиграющей", или вообще вечной (типа dmesg -w).


IID>В C/C++ решение тривиальное — заворачиваем первые 3 дескриптора std[in/out/err] в pipe, а потом select-ом выгребаем результаты и засылаем новые команды. А в питоне как ? Чтобы и дескрипторы заместить, и Popen в фоне исполнялся.

IID>Говно-потоки питонячьи не предлагать!

Почему не предлагать? Они отлично справятся с этой работой (что бы ты ни называл тут потоками), а если у тебя религиозные предпочтения — то это твои проблемы.

Но ты уже в постановке сравнения напортачил. Аналогом C++ решения будет решение на функциях из модуля os: fork(), exec*(), pipe() и т.д. — тогда и select доступен напрямую. Но это непортабельно.
А аналог решения на тех объектах, что создаются в subprocess.Popen — для C++ было бы, если бы создавались потоки или stdio (FILE*), или ios-based (ifstream и ofstream, поверх пайпов). Так вот ни в stdio, ни в iostream нету non-blocking I/O, и тебе придётся или делать собственные врапперы, или использовать стороннюю библиотеку (я видел такие аналоги stdio, но сейчас не найду названий), или опять же использовать треды.

Так что пример не прокатил. Ещё примеры есть? Только сначала включи голову, а то будет как сейчас.
Re[16]: Убунта
Здравствуйте, IID, Вы писали:

IID>С проблемами он работает, причём с огромными.

IID>Простейший пример — надо в дочернем процессе запустить bash и скармливать туда команды, получая выхлоп незамедлительно.

Ну простейшим это сложно назвать (реально, да, бывают похожие случаи, но 1/1000). Но предположим.

IID>Пока команда выполняется быстро — особых проблем нет. Но! Команда может быть "долгоиграющей", или вообще вечной (типа dmesg -w).


IID>В C/C++ решение тривиальное — заворачиваем первые 3 дескриптора std[in/out/err] в pipe, а потом select-ом выгребаем результаты и засылаем новые команды. А в питоне как ? Чтобы и дескрипторы заместить, и Popen в фоне исполнялся.

IID>Говно-потоки питонячьи не предлагать!

Почему не предлагать? Они отлично справятся с этой работой (что бы ты ни называл тут потоками), а если у тебя религиозные предпочтения — то это твои проблемы.

Но ты уже в постановке сравнения напортачил. Аналогом C++ решения будет решение на функциях из модуля os: fork(), exec*(), pipe() и т.д. — тогда и select доступен напрямую. Но это непортабельно. Я такое писал, и в более сложном случае (переходник для терминала с управлением по сети).
А аналог решения на тех объектах, что создаются в subprocess.Popen — для C++ было бы, если бы создавались потоки или stdio (FILE*), или ios-based (ifstream и ofstream, поверх пайпов). Так вот ни в stdio, ни в iostream нету non-blocking I/O, и тебе придётся или делать собственные врапперы, или использовать стороннюю библиотеку (я видел такие аналоги stdio, но сейчас не найду названий), или опять же использовать треды.

Так что пример не прокатил. Ещё примеры есть? Только сначала включи голову, а то будет как сейчас.