2017-02-15 1 views
2

Quelle est la différence entre ces deux options pour démarrer un nouveau processus avec subprocess.Popen pour python3.2+ sous Linux:Différence entre subprocess.Popen preexec_fn et start_new_session en python

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

je besoin de ce que je dois mettre un groupe de processus ID d'avoir la possibilité de tuer à la fois ce processus et tous ses enfants. Il est ensuite utilisé dans le cas si le processus temps d'exécution dépasse certain seuil:

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

J'ai testé mon code avec les options (les deux #1 & #2) et ils semblent tous deux travailler ok pour moi. Mais je me demande quelle est la meilleure option ici - celle avec preexec_fn ou celle avec start_new_session?

Répondre

1

Selon le Python Docs officiel,

Le paramètre preexec_fn n'est pas sûr à utiliser en présence de threads dans votre application. Le processus enfant peut se bloquer avant que exec soit appelé. Si vous devez l'utiliser, gardez-le trivial! Minimisez le nombre de bibliothèques que vous appelez.

Si vous avez besoin de modifier l'environnement pour l'enfant, utilisez le paramètre env plutôt que de le faire dans un preexec_fn. Le paramètre start_new_session peut prendre la place d'une utilisation préalable de preexec_fn pour appeler os.setsid() dans l'enfant.

donc je suppose que la réponse à votre question est que start_new_session a été introduit pour remplacer l'opération commune de l'utilisation preexec_fn pour définir l'identifiant de session par os.setsid(), qui est pas thread-safe.