Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中subprocess.Popen preexec_fn和start_new_会话之间的差异_Python_Subprocess_Popen_Kill Process_Setsid - Fatal编程技术网

python中subprocess.Popen preexec_fn和start_new_会话之间的差异

python中subprocess.Popen preexec_fn和start_new_会话之间的差异,python,subprocess,popen,kill-process,setsid,Python,Subprocess,Popen,Kill Process,Setsid,使用Linux下的python3.2+的subprocess.Popen启动新进程的这两个选项有什么区别: proc = subprocess.Popen(args, ..., preexec_fn=os.setsid) # 1 proc = subprocess.Popen(args, ..., start_new_session=True) # 2 我需要这样做,因为我需要设置进程组ID,以便能够立即杀死这个进程及其所有子进程。如果进程运行时间超过某个阈值,则使用此选项: try:

使用
Linux
下的
python3.2+
subprocess.Popen
启动新进程的这两个选项有什么区别:

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\u fn
的还是带
start\u new\u session

在应用程序中存在线程的情况下使用preexec_fn参数是不安全的。在调用exec之前,子进程可能会死锁。如果你一定要使用它,那就让它变得平凡吧!尽量减少您调用的库的数量

如果需要修改子级的环境,请使用env参数,而不是在preexec_fn中进行修改。start_new_session参数可以代替以前常用的preexec_fn来调用子进程中的os.setsid()

因此,我猜您的问题的答案是引入了
start\u new\u session
,以取代使用
preexec\u fn
通过
os.setsid()
设置会话id的常见操作,这不是线程安全的