J'ai un problème avec fraie asynchrone avec délai d'attente sous-processus en Python 3.asynchrone avec délai d'attente sous-processus
Ce que je veux atteindre: je veux reproduire plusieurs processus de manière asynchrone sans attendre un résultat mais je veux aussi être assuré que chaque processus engendré se terminera dans un délai donné.
J'ai rencontré des problèmes similaires ici: Using module 'subprocess' with timeout et Asynchronous background processes in Python? mais ils ne résolvent pas mon problème.
Mon code ressemble à ceci. J'ai la classe de commandement comme suggéré dans Using module 'subprocess' with timeout:
class Command(object):
def __init__(self, cmd):
self.cmd = cmd
self.process = None
def run(self, timeout):
def target():
print('Thread started')
args = shlex.split(self.cmd)
self.process = subprocess.Popen(args, shell=True)
self.process.communicate()
print('Thread finished')
thread = threading.Thread(target=target)
thread.start()
thread.join(timeout)
if thread.is_alive():
print('Terminating process')
self.process.terminate()
thread.join()
puis quand je veux reproduire: sous-processus
for system in systems:
for service in to_spawn_system_info:
command_str = "cd {0} && python proc_ip.py {1} {2} 0 2>>{3}".format(home_dir,
service, system, service_log_dir)
command = Command(command_str)
command.run(timeout=60)
Quand je lance cette sortie semble attendre que chaque commande à lancer et à la fin. Je reçois
Thread started
Thread finished
Thread started
Thread finished
Thread started
Thread finished
Thread started
Thread finished
Donc, ma question est ce que je fais mal? Maintenant, je commence à me demander s'il est possible d'engendrer un processus et de limiter son exécution par un dépassement de temps. Pourquoi ai-je besoin de cela? Le script spawner s'exécutera dans cron. Il sera exécuté toutes les 10 minutes et il doit générer environ 20 sous-processus. Je veux garantir que chaque sous-processus se terminera avant que le script ne soit à nouveau exécuté depuis cron.
Lorsque j'ai essayé cette solution, elle ne met pas fin à mes threads après l'expiration du délai. J'ai réglé le timeout à 1 sec et ajouté time.sleep (1) dans la fonction cible. Aucun thread n'a été arrêté. – sebast26
Hrmm. Le thread doit se terminer lorsque target() se termine. Gardez à l'esprit que, comme indiqué ci-dessus, vous n'obtiendrez pas une impression si le processus se termine normalement sans temporisation. Je vais regarder de plus près, j'ai peut-être oublié quelque chose. – mshildt
Ainsi, si le thread se termine avant la fin du sous-processus, le sous-processus se termine? C'est le contraire de ce que dit unutbu. Il a dit "alors chaque sous-processus que vous engendrerez subsistera même après la fin de vos discussions". J'avais également l'impression qu'un sous-processus allait continuer. – b10hazard