2016-03-19 18 views
1

Ich versuche Multithreading zu verwenden und um es einfach zu halten zuerst, ich bin mit den folgenden Code:Python Pool funktioniert nicht

import multiprocessing as mp 

pool = mp.Pool(4) 

def square(x): 

    return x**2 

results=pool.map(square,range(1,20)) 

wie ich sie verstehe, sollten die Ergebnisse eine Liste sein mit den Quadraten von 1 bis 20. Der Code scheint jedoch nicht zu enden. (Das gleiche ohne pool endet im Handumdrehen, das lief für einige Minuten, bevor ich es manuell gestoppt habe).

Weitere Informationen: Task-Manager sagt mir, dass die zusätzlichen Python-Prozesse gestartet wurden und ausgeführt werden, aber verwenden Sie% meiner CPU; noch andere nicht verwandte Prozesse wie Firefox explodieren in ihrer CPU-Nutzung, während das Programm läuft. Ich benutze Windows 8 und eine i5-4300U CPU (Pooling zu 2 statt 4 hilft auch nicht)

Was mache ich falsch? Gibt es gute Ressourcen in der Pool-Klasse, die mir helfen könnten zu verstehen, was mit meinem Code nicht stimmt?

+0

Versuchen Sie, in dem Sie Pool instanziiert und definieren Platz – user234461

+0

auf Python 3.4/Linux Ich erhalte AttributeErrors geworfen am Pool Prozesse – user234461

+0

Lesen Sie die Windows-spezifische Tipps in der Multiprozessing Dokumentation, wobei besonderes Augenmerk auf die Wende Ordnung Notwendigkeit für 'if __name__ == '__main __''. –

Antwort

0

Ihr Code verursacht, dass jeder Prozess auf einen Attributfehler stößt, weil er das square-Attribut nicht finden kann, weil es nicht definiert wurde, als Sie den Pool instanziiert haben. Die Prozesse hängen daher danach. Wenn Sie das Quadrat vor dem Pool definieren, wird das Problem behoben. auch

Siehe:

yet another confusion with multiprocessing error, 'module' object has no attribute 'f'

+0

dies nicht allein, Sie jedoch funktionierte ein Kommentar in dem darin enthaltenen Link hat mich Import Multiprozessing als mp def square (x) verwenden: \t return x ** 2 wenn __name__ == "__main__": Pool = mp.Pool (4) results = pool.map (quadratisch, range (1,20)) ich bin mir nicht sicher, wie das zu formatieren ist, also gibt es zwei weitere fragen: wie kommst du hier kommentar?) und wie ist diese ominöse Aussage, wenn der Code funktioniert? – axioman

1

Code mit Pool Initialisierung sollte innerhalb __name__ == "__main__" als multiprocessing das Modul jedes Mal importiert, ein neues Verfahren zum Laichen.

import multiprocessing as mp 

def square(x): 
    return x**2 

if __name__ == '__main__': 
    pool = mp.Pool(4) 
    results=pool.map(square,range(1,20))