2017-02-15 3 views
2

В чем разница между этими двумя вариантами, чтобы начать новый процесс с subprocess.Popen для python3.2+ под Linux:Разница между subprocess.Popen preexec_fn и start_new_session в питона

proc = subprocess.Popen(args, ..., preexec_fn=os.setsid) # 1 
proc = subprocess.Popen(args, ..., start_new_session=True) # 2 

мне это нужно, как мне нужно, чтобы установить группу процессов ID, чтобы иметь возможность убить сразу этот процесс и всех его детей. Затем он используется в том случае, если время процесса запуска превышает определенный порог:

try: 
    out, err = proc.communicate(timeout=time_max) 
except subprocess.TimeoutExpired: 
    os.killpg(os.getpgid(proc.pid), signal.SIGTERM) 

Я проверил мой код с обоими вариантами (#1 & #2) и они оба, кажется, работает хорошо для меня.

Но мне интересно, что здесь лучший вариант - один с preexec_fn или с start_new_session?

ответ

1

Согласно официальному Python Docs,

Параметр preexec_fn не является безопасным для использования в присутствии потоков в приложении. До того, как вызывается exec, дочерний процесс может зайти в тупик. Если вы должны использовать его, сохраните его тривиально! Минимизируйте количество библиотек, на которые вы звоните.

Если вам нужно изменить среду для ребенка, используйте параметр env вместо того, чтобы делать это в preexec_fn. Параметр start_new_session может заменить прежнее использование preexec_fn для вызова os.setsid() в дочернем элементе.

Так что я думаю, ответ на ваш вопрос в том, что start_new_session был введен, чтобы заменить общую работу с помощью preexec_fn установить идентификатор сеанса через os.setsid(), который не поточно.

Смежные вопросы