Maison >développement back-end >Tutoriel Python >Pourquoi est-ce que j'obtiens « RuntimeError : Tentative de démarrage d'un nouveau processus avant que le processus en cours n'ait terminé sa phase d'amorçage » lorsque j'utilise le multitraitement sous Windows ?

Pourquoi est-ce que j'obtiens « RuntimeError : Tentative de démarrage d'un nouveau processus avant que le processus en cours n'ait terminé sa phase d'amorçage » lorsque j'utilise le multitraitement sous Windows ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-21 06:26:10611parcourir

Why am I getting

Erreur de multitraitement Windows : RuntimeError

Lorsqu'ils tentent d'utiliser le multitraitement sous Windows, les utilisateurs peuvent rencontrer l'erreur suivante :

RuntimeError:
Attempt to start a new process before the current process
has finished its bootstrapping phase.

Cette erreur se produit car les sous-processus Windows importent le module principal lors de l'initialisation, conduisant potentiellement à la création récursive de sous-processus. Pour éviter cela, il est crucial d'inclure un if __name__ == '__main__': guard dans le module principal. Cela empêche la création de sous-processus à partir du module principal.

Considérez l'extrait de code suivant, qui illustre le problème :

testMain.py :

import parallelTestModule

extractor = parallelTestModule.ParallelExtractor()
extractor.runInParallel(numProcesses=2, numThreads=4)

parallelTestModule.py :

import multiprocessing
from multiprocessing import Process

class ParallelExtractor:
    def runInParallel(self, numProcesses, numThreads):
        myprocs = []
        for pid in range(numProcesses):
            pr = Process(target=self.runp, args=(pid, numThreads))
            myprocs.append(pr)

        for i in myprocs:
            i.start()

        for i in myprocs:
            i.join()

Pour résoudre cette erreur, modifiez le script testMain.py pour inclure le if __name__ == '__main__': guard:

import parallelTestModule

if __name__ == '__main__':
    extractor = parallelTestModule.ParallelExtractor()
    extractor.runInParallel(numProcesses=2, numThreads=4)

Cette modification garantit que les sous-processus ne sont pas créés de manière récursive, résolvant ainsi l'erreur RuntimeError sur les machines Windows.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn