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

),它们对我来说都正常
但我想知道这里最好的选择是什么——带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的常见操作,这不是线程安全的