J'ai ce code :
class ExtendedProcess(multiprocessing.Process):
def __init__(self):
super(ExtendedProcess, self).__init__()
self.stop_request = multiprocessing.Event()
def join(self, timeout=None):
logging.debug("stop request received")
self.stop_request.set()
super(ExtendedProcess, self).join(timeout)
def run(self):
logging.debug("process has started")
while not self.stop_request.is_set():
print "doing something"
logging.debug("proc is stopping")
Lorsque j'appelle start() sur le processus, il devrait tourner indéfiniment, puisque self.stop_request() n'est pas activé. Après quelques milisecondes, join() est appelé par lui-même et interrompt l'exécution. Que se passe-t-il ? Pourquoi join est-il appelé par lui-même ?
De plus, lorsque je lance un débogueur et que je parcours ligne par ligne, tout fonctionne soudainement très bien..... Qu'est-ce que j'ai raté ?
OK, grâce à la réponse d'Ely, la raison m'a frappé :
Il y a une condition de course -
- nouveau processus créé...
- alors qu'il se lance et est sur le point de s'exécuter logging.debug("le processus a démarré") la fonction principale se termine.
- la fonction principale appelle sys exit et sur sys exit python appelle tous les processus terminés à se fermer avec join().
- puisque le processus n'a pas réellement frappé "while not self.stop_request.is_set()" join est appelé et "self.stop_request.set()". Maintenant stop_request.is_set et le code se ferme.