Появление вызова Python, который вызывает сценарий с использованием многопроцессорной обработки (проблема pgrp)?

1

Я пишу unittesting framework для серверов, которые используют popen, чтобы в основном выполнить "python myserver.py" с shell = False, запустить несколько тестов, а затем перейти на сервер вниз с помощью killpg.

Этот myserver.py может и будет использовать многопроцессорную обработку для создания собственных подпроцессов. Проблема в том, что из моих тестов кажется, что pgrp pid серверных процессов разделяет ту же группу pid, что и фактический основной поток, запускающий unittests, поэтому выполнение os.killpg на группе pid не только приведет к удалению сервера, но также процесс, вызывающий popen (не то, что я хочу сделать). Почему он это делает? И как я могу заставить их быть на отдельных группах, которые я могу убить самостоятельно?

Теги:

1 ответ

1
Лучший ответ

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

Как правило, новая группа процессов создается только системным вызовом setpgrp (2). В противном случае процессы, созданные fork (2), всегда являются членами текущей группы процессов. Тем не менее, при создании новой группы процессов процессы в этой группе даже не контролируются никаким tty, и выполнение того, что вы хотите делать правильно, требует понимания всей модели группы процессов. Хорошая ссылка на то, как все это работает, - Стивенс, "Продвинутое программирование в среде Unix", которое подробно изложено в нем.

Если вы действительно захотите спуститься по этому маршруту, вам придется реализовать всплывающие окна или их эквивалент со всеми соответствующими системными вызовами.

  • 1
    Вам не нужно переопределять popen. Используйте subprocess.Popen с preexec_fn = os.setpgrp .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню