Von 1970 bis etwa 2002 verdoppelte sich die Geschwindigkeit der Prozessoren etwa alle 18 Monate. Als Programmierer mussten Sie also nur warten, und Ihr Programm wurde schneller. Das Problem ist, dass sich um 2002 die Regeln geändert haben. Jetzt stellen sie keine größeren, schnellen Prozessoren her, sondern sie stellen kleinere, langsamere Prozessoren her, sondern stellen sie in Gruppen heraus. Der Computer, an dem ich arbeite, hat jetzt 4 Kerne und Chips mit bis zu 8 Kernen (und 4 Threads pro Kern) sind vorhanden. Bald werden wir Chips mit viel mehr Kernen haben.
Wenn Sie also ein Programm schreiben, das überhaupt nicht gleichzeitig abläuft, werden Sie feststellen, dass Sie 1 Core oder Thread verwenden, aber der Rest der CPU sitzt da und tut nichts. Wenn Sie also 16 Kerne haben, wird 1 Ihr Programm ausführen und die anderen 15 sitzen dort!
Das Problem mit der Parallelität ist, dass sie nicht deterministisch ist. Das heißt, dass Sie nicht genau wissen, in welcher Reihenfolge die verschiedenen Threads arbeiten. Herkömmlicherweise haben Programmierer versucht, dies mithilfe von Sperren und dergleichen zu lösen. Dies hat zu einer Menge Schmerzen geführt. Eine Form von veränderlichem Zustand zu haben, auf die mehr als ein Thread frei zugreifen kann, ist oft eine Formel für Schmerz und heisnebugs!
In letzter Zeit geht der Trend dazu, zu funktionalen Sprachen überzugehen, die den veränderlichen Zustand genau kontrollieren. Es gibt zwei grundlegende Möglichkeiten, wie funktionale Sprachen mit der Parallelität umgehen. Die erste Möglichkeit ist das Übergeben von Nachrichten. Dies zeigt am besten Erlang. In Erlang gibt es im Allgemeinen keinen gemeinsamen Status zwischen Prozessen. Sie kommunizieren nicht, indem sie den Speicher teilen, sondern indem sie meine Nachrichten weitergeben. Dies sollte für Sie einen Sinn ergeben, da wir dies gerade tun. Ich sende Ihnen diese Informationen, indem ich Ihnen eine Nachricht sende, nicht indem Sie sich aus meinem Kopf daran erinnern! Durch die Umstellung auf Message Passing verschwinden die meisten Sperrfehler. Außerdem können Nachrichten sowohl über das Netzwerk als auch innerhalb eines Knotens weitergeleitet werden.
Die andere Methode ist STM, was für Software Transcriptional Memory steht. Dies ist in clojure und Haskell (und anderen) vorhanden. Im STM-Modus wird der Speicher gemeinsam genutzt, Änderungen können jedoch nur über eine Transaktion vorgenommen werden. Wie die Database-Leute in den 1970ern herausgefunden haben, ist es ziemlich einfach sicherzustellen, dass wir es richtig machen.
Eigentlich habe ich ein bisschen vereinfacht, Clojure und Haskell können beide Nachrichten weiterleiten, und Erlang kann STM.
Haftungsausschluss Ich bin der Autor von Programming Web Services mit Erlang , das in den nächsten Wochen in der Vorabversion erscheinen wird.