lancer des commandes python en parallele

lancer des commandes python en parallele - Python - Programmation

Marsh Posté le 24-07-2014 à 17:17:51    

Bonjour,
je souhaite ecrire un code qui recupere quotidiennement des fichiers sur un parc de serveurs (via rsync lancé par os.system). J'ai un grosse bande passande sur le site ou tourne mon programme et des petites bande passante sur les sites ou sont posés les serveurs.
J'aimerai donc pour éviter l'attente, que les rsync soit lancés par lots en parallele.
Auriez vous des conseils ?

Reply

Marsh Posté le 24-07-2014 à 17:17:51   

Reply

Marsh Posté le 24-07-2014 à 22:04:22    

Salut,
Plutot que d'utiliser os.system, tu devrais regarder du côté de subprocess.popen()  
 
Tu passes tes arguments sous la forme d'une liste, et un nouveau process s'executant en arrière plan va être créé.
Contrairement à os.system, tu récupèreres la main immédiatement sans attendre la fin de l'exécution.
 
Tu peux ensuite en faire ce que tu veux: vérifier s'il est toujours vivant ou pas, attendre la fin de l'execution, communiquer via STDIN/STDOUT, etc...

Reply

Marsh Posté le 25-07-2014 à 09:13:02    

interessant, merci pour ta réponse, je teste

Reply

Marsh Posté le 25-07-2014 à 11:35:45    

ca semble me convenir ca me donne une truc du genre:

Code :
  1. monprocess1=subprocess.Popen(commande1, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True) 
  2. monprocess2=subprocess.Popen(commande2, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True) 
  3. monprocess3=subprocess.Popen(commande3, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True) 
  4. monprocess4=subprocess.Popen(commande4, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True)


mais comment savoir que le process est en cours/terminé ?

Reply

Marsh Posté le 25-07-2014 à 12:25:15    

monprocess1.poll retourne none sur mon process est en cours
monprocess1.poll retourne 0 su le process est terminé

Reply

Marsh Posté le 25-07-2014 à 15:21:23    

C'est ca: None si en cours, ou bien le code retour de l'executable s'il est terminé (0 dans ton cas).
 
Je te conseille de bien lire la doc dispo:
https://docs.python.org/2/library/subprocess.html
 
Autre chose, plutot que de passer en paramètre ta commande directement et d'utiliser "shell=True", il est plutôt conseillé d'utiliser "shell=False" (et donc de passer en 1er paramètre de popen  une liste avec comme 1er élément le chemin vers l'exécutable, puis comme éléments suivants les paramètres nécessaires à cet exécutable.)
Ca evite de lancer un autre process intermédiaire (bin/sh) qui lui même lance le process voulut, et d'une manière générale c'est une bonne habitude à prendre pour éviter des problèmes de sécurité dans certaines conditions.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed