差异

2017-02-15 115 views
2

是什么开始为python3.2+Linuxsubprocess.Popen一个新的进程这两个选项之间的区别:差异

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

我需要这个,因为我需要设置进程组身份证有可能立即杀死这个过程及其所有的孩子。这是在随后的情况下使用,如果进程中运行时间超过一定的阈值:

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

我测试我的代码与这两个选项(#1 & #2),他们似乎都为我工作正常。

但我想知道这里最好的选择是什么 - 与preexec_fnstart_new_session

回答

1

根据官方Python Docs

的preexec_fn参数不是安全的线程的应用程序中存在使用。在调用exec之前,子进程可能会死锁。如果你必须使用它,保持它微不足道!最大限度地减少您调用的库的数量。

如果您需要为孩子修改环境,请使用env参数,而不是在preexec_fn中进行。 start_new_session参数可以取代先前普遍使用的preexec_fn来在子级中调用os.setsid()。

所以我想回答你的问题是start_new_session引入通过os.setsid()更换使用preexec_fn设置会话ID的共同操作,这不是线程安全的。