5
votes

Comment redémarrer un processus à l'aide du module multitraitement python

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

  • Comment redémarrer le processus
  • Une fois terminé, pourquoi il va zombie mod
  • Comment puis-je supprimer le processus zombie
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


0 commentaires

3 Réponses :


5
votes

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)


0 commentaires

4
votes

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:

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 .


0 commentaires

-2
votes

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()


1 commentaires

le code lèvera une erreur assert self._popen vaut None, 'impossible de démarrer un processus deux fois'