J'ai du mal à comprendre la différence entre run ()
et start ()
. Selon la documentation, la méthode run ()
invoque l'objet appelable passé au constructeur de l'objet, tandis que la méthode start ()
démarre le processus et ne peut être appelée qu'une seule fois.
J'ai essayé un exemple ci-dessous:
process_1 35138 process_2 35138 process_1 35141 process_2 35142
Les résultats sont ci-dessous:
def get_process_id(process_name): print process_name, os.getpid() p1 = multiprocessing.Process(target=get_process_id, args=('process_1',)) p2 = multiprocessing.Process(target=get_process_id, args=('process_2',)) p1.run() p2.run() p1.start() p2.start()
Quand j'utilise run ( )
, cela montre que p1
et p2
utilisent le même processus. Mais quand j'utilise start ()
, ils donnent les deux différences. Est-ce parce que l'appel de run ()
n'a rien à voir avec le processus qui l'appelle, mais simplement l'appel de la fonction (qui est get_process_id
dans cet exemple)? p>
3 Réponses :
Vous avez parfaitement raison. Comme décrit dans la documentation , run ()
est le point d'entrée du nouveau thread créé par start ()
.
Vous n'êtes pas censé appeler explicitement process.run ()
. C'est la méthode qui appelle votre fonction target
spécifiée, sauf si vous la remplacez lorsque vous sous-classez Process
. Il est normalement appelé dans le nouvel enfant pendant qu'il démarre. Il ne fait rien d'autre que d'appeler la fonction cible.
# multiprocessing.process.BaseProcess def run(self): ''' Method to be run in sub-process; can be overridden in sub-class ''' if self._target: self._target(*self._args, **self._kwargs)
Lorsque vous l'appelez dans votre processus parent, il est exécuté dans votre processus parent comme toute autre méthode.
process.start () est la méthode que vous êtes censé appeler dans votre parent pour créer le nouveau processus en premier lieu.
L'appel de start ()
créera un nouveau thread et exécutera run ()
dans ce nouveau thread. Alors qu'en invoquant run ()
vous-même, vous l'exécuterez dans le thread actuel lui-même. L'exécution de run ()
ne passera pas à un autre thread. Il exécutera donc ses actions sur le thread principal lui-même.
En relation: stackoverflow.com/questions / 23224784 /…