Python multithreading zu langsam, Multiprozess -
Ich bin ein multiprocessing-Neuling,
Ich weiß etwas über threading, aber ich brauche zur Erhöhung der Geschwindigkeit der Berechnung, hoffentlich mit multiprocessing:
Beispiel Beschreibung: sendet string an einen thread, ändert string + benchmark-test,
schicken das Ergebnis zurück zum drucken.from threading import Thread class Alter(Thread): def __init__(self, word): Thread.__init__(self) self.word = word self.word2 = '' def run(self): # Alter string + test processing speed for i in range(80000): self.word2 = self.word2 + self.word # Send a string to be altered thread1 = Alter('foo') thread2 = Alter('bar') thread1.start() thread2.start() #wait for both to finish while thread1.is_alive() == True: pass while thread2.is_alive() == True: pass print(thread1.word2) print(thread2.word2)
Dies ist momentan dauert etwa 6 Sekunden, und ich muss es schneller gehen.
Ich habe auf der Suche in multiprocessing und kann nicht etwas finden, äquivalent zu dem obigen code. Ich denke, was ich am nach ist pooling aber Beispiele, die ich gefunden habe, wurden schwer zu verstehen. Ich möchte nutzen alle cores (8 Kerne) multiprocessing.cpu_count()
aber ich habe nur Fetzen von nützlichen Informationen über multiprocessing und nicht genug, um das Duplikat des obigen code. Ob jemand kann mich in die richtige Richtung oder noch besser ein Beispiel geben, dass würde sehr geschätzt werden. Python 3 bitte
- nicht besetzt-warten-thread zu vervollständigen. verwenden Sie Thread.join()!
- warum nicht? Ich habe dies getan, in den meisten meiner Kodierung und wenn Sie einen guten Grund, werde ich ändern 🙂
- nun, es ist mindestens so gut wie besetzt-warten-und wahrscheinlich macht Sie passiv warten, bis der thread beendet wird, ohne Essen, ohne mit der cpu (obwohl ich es nicht finden können im docs-ich würde Wetten cpython keine " busy-wait im Thread.join()).
- **das kommt wohl auf die Plattform sowieso.
- ok, das macht Sinn, ich denke, ich werde diese join () - moving forward
- Besetzt-warten, wie das halten wird das GIL, und verhindern, dass Ihr worker-threads ausgeführt werden. Auch, wenn Sie nicht genug CPUs, dann eine CPU, die könnte in Ihrem worker-thread tun, nützliche Arbeit, im Umgang mit einem OS zu unterbrechen, oder sich mit einige andere Prozess statt, um Wärme zu erzeugen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersetzen Sie einfach
threading
mitmultiprocessing
undThread
mitProcess
. Threads in Pyton sind (fast) nie verwendet, um Leistung erhalten, weil der big bad GIL! Ich erklärte es in einem anderen SO-post mit einigen links zu Unterlagen und große reden über threading in python.Aber die multiprocessing Modul ist absichtlich sehr ähnlich, um das threading-Modul. Kann man fast verwenden Sie es wie ein drop-in-Ersatz!
Dem multiprocessing-Modul nicht AFAIK bieten die Funktionalität zum erzwingen der Verwendung einer bestimmten Menge an Kernen. Es beruht auf der OS-Umsetzung. Sie könnte den Pool, Objekt und Grenze des Arbeiter-onjects der core-Anzahl. Oder man konnte sich für eine andere MPI-Bibliothek wie pypar. Unter Linux könnte man mit einem Rohr unter der shell zu starten mehrerer Instanzen auf verschiedenen Kernen