36 votes

Bombe multitraitement

Je travaillais sur l'exemple suivant du tutoriel de Doug Hellmann sur le multitraitement:

 import multiprocessing

def worker():
    """worker function"""
    print 'Worker'
    return

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker)
        jobs.append(p)
        p.start()
 

Lorsque j'ai essayé de l'exécuter en dehors de l'instruction if:

 import multiprocessing

def worker():
    """worker function"""
    print 'Worker'
    return

jobs = []
for i in range(5):
    p = multiprocessing.Process(target=worker)
    jobs.append(p)
    p.start()
 

Les processus de frai ont commencé sans interruption, et le seul moyen de l’arrêter était de redémarrer!

Pourquoi cela arriverait-il? Pourquoi ne pas générer 5 processus et sortir? Pourquoi ai-je besoin de la déclaration if?

46voto

Denis Otkidach Points 13111

Sous Windows, il n'y a pas de routine fork() . Ainsi, multiprocessing importe le module actuel pour accéder à la fonction worker . Sans la déclaration if , le processus enfant commence ses propres enfants, etc.

8voto

nikow Points 8887

Notez que la documentation mentionne que vous avez besoin de l' if déclaration sur windows (ici).

Toutefois, la documentation n'est pas dire que cela tue votre machine presque instantanément, nécessitant un redémarrage. Donc cela peut être assez déroutant, surtout si l'utilisation de l' multiprocessing qui se passe dans certaines fonction profondément à l'intérieur du code. Peu importe la façon dont profondément caché, il est, vous avez encore besoin de l' if vérifier dans le fichier de programme principal. Ce joli beaucoup de règles à l'aide de multiprocessing dans n'importe quel type de bibliothèque.

multiprocessing en général semble un peu rude. Il pourrait avoir l'interface de la thread de l'interface, mais il n'y a tout simplement pas de moyen simple de contourner le GIL.

Pour les plus complexes de parallélisation de problèmes je voudrais aussi regarder l' subprocess module ou certains autres bibliothèques (comme mpi4py ou Parallèle Python).

4voto

Marcelo Cantos Points 91211

Je ne sais pas à propos de multiprocessing , mais je soupçonne que cela génère des processus enfants qui ont un __name__ global différent. En supprimant le test, vous obligez chaque enfant à recommencer le processus de reproduction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X