Diferencia entre subprocess.Popen preexec_fn y start_new_session en python

¿Cuál es la diferencia entre estas dos opciones para iniciar un nuevo proceso con subprocess.Popen para python3.2+ en Linux :

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

Necesito esto ya que necesito configurar la ID del grupo de proceso para tener la posibilidad de matar de una vez este proceso y todos sus hijos. Esto se usa en el caso si el tiempo de ejecución del proceso excede cierto umbral:

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

Probé mi código con las dos opciones ( #1 y #2 ) y ambas parecen funcionar bien para mí.

Pero me pregunto cuál es la mejor opción aquí, ¿la que tiene preexec_fn o la que tiene start_new_session ?

Según los documentos oficiales de Python ,

El parámetro preexec_fn no es seguro de usar en presencia de subprocesos en su aplicación. El proceso hijo podría bloquearse antes de que se llame a exec. Si debes usarlo, ¡manténlo trivial! Minimiza el número de bibliotecas a las que llamas.

Si necesita modificar el entorno para el hijo, use el parámetro env en lugar de hacerlo en un preexec_fn. El parámetro start_new_session puede tomar el lugar de un uso previamente común de preexec_fn para llamar a os.setsid () en el hijo.

Entonces, supongo que la respuesta a su pregunta es que start_new_session se introdujo para reemplazar la operación común de usar preexec_fn para establecer el ID de sesión a través de os.setsid() , que no es seguro para subprocesos.