Maison  >  Article  >  développement back-end  >  Pourquoi est-ce que je reçois une RuntimeError sous Windows lors de l’utilisation du multitraitement ?

Pourquoi est-ce que je reçois une RuntimeError sous Windows lors de l’utilisation du multitraitement ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-16 10:43:03552parcourir

Why Am I Getting a RuntimeError on Windows When Using Multiprocessing?

RuntimeError sous Windows lors de l'utilisation du multitraitement

La rencontre d'une « RuntimeError » lors de la tentative d'utilisation du multitraitement sous Windows indique un problème potentiel avec le démarrage du programme phase. Cette erreur se produit généralement lorsque le module principal lance des sous-processus sans utiliser le langage approprié.

Pour résoudre ce problème, assurez-vous que le module principal inclut la ligne suivante avant de lancer des sous-processus :

if __name__ == '__main__':
    freeze_support()

Exemple de code

Considérez l'extrait de code simplifié suivant qui tente d'utiliser le multitraitement dans des modules séparés sous Windows :

testMain.py (module principal)

import parallelTestModule

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

parallelTestModule.py (module séparé)

import multiprocessing
from multiprocessing import Process
import threading

class ThreadRunner(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
    def run(self):
        print(self.name, '\n')

class ProcessRunner:
    def runp(self, pid, numThreads):
        mythreads = []
        for tid in range(numThreads):
            name = "Proc-"+str(pid)+"-Thread-"+str(tid)
            th = ThreadRunner(name)
            mythreads.append(th) 
        for i in mythreads:
            i.start()
        for i in mythreads:
            i.join()

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

        for i in myprocs:
            i.join()

Solution appliquée

Pour corriger l'erreur d'exécution sur Windows, ajoutez le if name == '__main__': guard au module principal :

import parallelTestModule

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

En complétant cette modification, le programme gérera correctement les sous-processus comme prévu sans déclencher l'erreur RuntimeError .

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