J'essaie de redémarrer un processus python à l'aide du module multiprocesseur, mais "AssertionError: impossible de démarrer un processus deux fois" apparaît.
Ma question
import time from multiprocessing import Process def worker (): while True: print "Inside the worker" time.sleep(10) p1 = Process(target=worker,name="worker") p1.start() #p1.join() time.sleep(3) p1.terminate() print "after Termination " time.sleep(3) p1.start()
En fait, j'essaie de créer une fonction de surveillance de processus pour surveiller l'utilisation de la mémoire et du processeur de tous les processus. S'il atteint un certain niveau, je souhaite redémarrer en temps réel
3 Réponses :
J'espère que cela vous aidera
import time from multiprocessing import Process def worker (): while True: print "Inside the worker" time.sleep(10) def proc_start(): p_to_start = Process(target=worker,name="worker") p_to_start.start() return p_to_start def proc_stop(p_to_stop): p_to_stop.terminate() print "after Termination " p = proc_start() time.sleep(3) proc_stop(p) time.sleep(3) p = proc_start() print "start gain" time.sleep(3) proc_stop(p)
Comment puis-je redémarrer le processus?
Vous ne pouvez pas redémarrer un processus terminé. Vous devez instancier un nouveau processus.
Une fois terminé, pourquoi passer au mod zombie?
Parce que sur les systèmes Unix-y, le processus parent a besoin de lire le code de sortie avant que le noyau efface l'entrée correspondante de la table de processus.
Comment puis-je supprimer le processus zombie?
Vous avez plusieurs options. Je cite les documents ici: p>
Rejoindre les processus zombies
Sous Unix, lorsqu'un processus se termine mais n'a pas été rejoint, il devient un zombie. Il ne devrait jamais y en avoir beaucoup car à chaque fois qu'un nouveau processus démarre (ou active_children () est appelé), tous les processus terminés qui n'ont pas encore été joints seront joints. L'appel de Process.is_alive d'un processus terminé rejoindra également le processus. Même dans ce cas, il est probablement recommandé de rejoindre explicitement tous les processus que vous démarrez.
En fait, j'essaie de créer une fonction de surveillance de processus pour surveiller l'utilisation de la mémoire et du processeur de tous les processus.
Vous devriez jeter un œil au module psutil pour cela.
Si vous souhaitez simplement suspendre (et non tuer) les processus si la consommation de mémoire devient trop élevée, vous pourrez peut-être vous inspirer de ma réponse ici .
Le processus terminate () ne permettra pas de redémarrer le processus mais le processus kill () peut être utilisé et le processus peut être redémarré. ça marche
import time from multiprocessing import Process def worker (): while True: print "Inside the worker" time.sleep(10) p1 = Process(target=worker,name="worker") p1.start() #p1.join() time.sleep(3) p1.kill() print "after kill" time.sleep(3) p1.start()
le code lèvera une erreur assert self._popen vaut None, 'impossible de démarrer un processus deux fois'