5
votes

Différence entre Process.run () et Process.start ()

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 :


1
votes

Vous avez parfaitement raison. Comme décrit dans la documentation , run () est le point d'entrée du nouveau thread créé par start () .


0 commentaires

6
votes

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.


0 commentaires

4
votes

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.


0 commentaires