Die gleichzeitige Programmierung ist für mich ziemlich schwierig: Selbst das Anschauen einer einfachen Folie scheint mir eine Herausforderung zu sein. Es scheint so abstrakt.
Was sind die Vorteile, wenn Sie Concurrent-Programmierkonzepte gut kennen? Hilft es mir bei der regelmäßigen, sequentiellen Programmierung? Ich weiß, dass es eine Befriedigung ist zu verstehen, wie unsere Programme funktionieren, aber was noch?
concurrency
Adel
quelle
quelle
Antworten:
Hier ist eine schnelle und einfache Motivation: Wenn Sie etwas Code wollen , aber die kleinsten, schwächsten Systeme, Sie werden gleichzeitig Code schreiben.
Möchten Sie für die Cloud schreiben? Recheninstanzen in der Cloud sind klein. Man bekommt keine großen, man bekommt viele kleine. Plötzlich ist Ihre kleine Web-App eine gleichzeitige App. Wenn Sie es gut entworfen haben, können Sie einfach mehr Server einwerfen, wenn Sie Kunden gewinnen. Ansonsten müssen Sie lernen, wie die durchschnittliche Auslastung Ihrer Instanz festgelegt wird.
OK, Sie möchten Desktop-Apps schreiben? Alles hat eine Dual-oder-More-Core-CPU. Außer den billigsten Maschinen. Und Leute mit den billigsten Maschinen werden wahrscheinlich nicht nach Ihrer teuren Software suchen, oder?
Vielleicht möchten Sie eine mobile Entwicklung durchführen? Hey, das iPhone 4S hat eine Dual-Core-CPU. Der Rest wird nicht weit dahinter sein.
Videospiele? Die Xbox 360 ist ein Multi-CPU-System und die PS3 von Sony ist im Wesentlichen ein Multi-Core-System.
Sie können sich der gleichzeitigen Programmierung nur entziehen, wenn Sie an winzigen, einfachen Problemen arbeiten.
Update 2016 : Die aktuelle Version des Raspberry Pi für 35 US-Dollar basiert auf einem Quad-Core-System auf einem für Mobiltelefone bestimmten Chip. Zum Teil dank der Verfügbarkeit von High-End-Grafikkarten als Parallel-Compute-Engines wurden dramatische Fortschritte in der KI erzielt.
quelle
Everything has a dual-or-more-core-CPU. Except the least expensive machines.
scheint es ein wenig absurd zu sein , das zu sagen . Viele Leute haben Single-Core-Maschinen, nicht weil sie billig waren, sondern weil sie mit dem, was sie haben, zufrieden sind und keine Notwendigkeit für ein Upgrade sehen. Das sei gesagt, in Bezug auf die Gleichzeitigkeit Denken wird auch den Scheduler auf einem Single-Core - System helfen, damit es nicht Mühe verschwendet wird überall können Sie preemptives Multitasking übernehmen, entweder (das ist über jeden Multitasking - Umgebung die meisten Entwickler in Kontakt kommen, heutzutage).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.
quelle
Weil die Nebenläufigkeit in Ihrem Gesicht explodieren kann, wenn Sie es am wenigsten erwarten ...
quelle
Die erste Regel für die gleichzeitige Programmierung lautet "Es ist schwierig". Die zweite Regel der gleichzeitigen Programmierung lautet "Es ist schwierig". !!
Im Ernst, es gibt zwei gemeinsame Ansätze für die gleichzeitige Programmierung, Multi-Threading und Multi-Processing. Multi-Processing ist am einfachsten zu verstehen, da es nur bedeutet, dass mehrere Instanzen eines Prozesses ausgeführt werden, um eine Aufgabe auszuführen. Auf Unix-basierten Systemen ist dies über Aufrufe zum Verzweigen / Verbinden ziemlich einfach, auf Windows-Systemen jedoch nicht so einfach.
Multi-Threading ist wahrscheinlich der Ansatz, an den die meisten Menschen denken, wenn sie über Parallelität sprechen. Es ist nicht schwierig, mehrere Threads in einer Anwendung zu starten, aber der Teufel steckt im Detail. Sie müssen den Datenaustausch zwischen Threads koordinieren (normalerweise mithilfe von Sperren), was zu einem Deadlock oder Daten in einem ungültigen Zustand führen kann. Sie müssen auch verstehen, wie zwischen Threads mithilfe von Konzepten wie Semaphoren, bedingten Variablen usw. usw. kommuniziert wird.
Der Vorteil dabei ist, dass Sie die zugrunde liegende Hardware effektiver nutzen können, wenn Sie sie erst einmal verstanden haben. Heutzutage ist es so ziemlich die Norm für einen Prozessor, mehrere Kerne zu haben. Durch gleichzeitiges Programmieren können Sie diese Kerne für sich arbeiten lassen und Ihre Anwendung wird schneller.
Der Nachteil ist, dass Sie sich überlegen müssen, wie Sie Ihre Anwendung in kleine Teile aufteilen, die auf verschiedenen Threads ausgeführt werden können. Das ist viel schwieriger als es sich anhört. Hochkonkurrierende Lösungen können für den Komponententest auch umständlich sein, da die Ausführungsreihenfolge weniger deterministisch ist.
Heutzutage werden die meisten Sprachen mit einer Abstraktion über die meisten gleichzeitigen Primitiven geliefert, um das Leben ein bisschen einfacher zu machen. Zum Beispiel wird .NET 4 mit der Task Parallel Library ausgeliefert, die das Leben ein wenig erleichtert. In Java haben sie das Concurrency- Paket.
quelle
Ich hatte vor kurzem eine sehr interessante Aufgabe zu erledigen, bei der mich die Mehrfachverarbeitung gerettet hat. Grundsätzlich musste ich viele Anfragen an ein paar separate Server richten, die sich mit sehr kleinen Datenmengen befassten, aber viele Anfragen.
Bei der Arbeit mit PHP habe ich die Dinge auf die altmodische Art und Weise gemacht, und die beste Zeit, die ich nach ein paar Stunden Arbeit erhielt, ergab ~ 120 Sekunden , um einen bestimmten Test auszuführen (viele Anfragen + Netzwerkverzögerung + keine asynchrone Verbindung).
Aber das war nicht annähernd genug im Vergleich zu dem, was ich brauchte, und nachdem ich mit PHPs Multiprozessing kläglich gescheitert war, wechselte ich zu Python.
Nach ein paar Stunden hatte ich ein laufendes Python-Multiprozessor-Skript, das in 20 Sekunden ausgeführt wurde, und nach einigem Hin und Her mit den Timeouts und Nein. von Threads verwendet werden, habe ich es bis zu ~ 10 Sekunden .
Dies war für eine Website, die zu 100% in PHP geschrieben war, mit Ausnahme eines einzelnen 100-zeiligen Python-Skripts. Und das Ganze funktioniert perfekt.
Mein Fazit wäre, dass, auch wenn es Ihnen nicht von Tag zu Tag weiterhilft, Sie möglicherweise in Situationen geraten, in denen es Ihnen sehr hilft, zumindest die Grundlagen der gleichzeitigen Programmierung zu kennen.
Viel Glück und viel Spaß beim Programmieren!
PS: Ich versuche nicht, PHP zu schlagen, aber PHP war einfach nicht das richtige Werkzeug für den jeweiligen Job.
PS2: Die Kenntnis einer neuen Technologie oder einer neuen Art, Dinge zu tun, kann die Tür zu einer völlig neuen Welt von Möglichkeiten öffnen.
quelle
Wenn Sie irgendeine Art von Webentwicklung durchführen, kommt die Nebenläufigkeit ins Spiel, zumindest bei den meisten Sprachen. Zum Beispiel benutze ich spring für die Webentwicklung und jede neue Anfrage kommt als eigener Thread. Wenn also eine Anforderung auf ein gemeinsam genutztes Objekt zugreift, in dem der Status einer Variablen geändert werden kann, spielt die Parallelität eine große Rolle und muss berücksichtigt werden. Wenn dies nicht der Fall ist, können die Daten auf unvorhersehbare Weise bearbeitet und Daten beschädigt werden. Es ist nicht kritisch, jedes Detail über Parallelität zu wissen, aber es ist wichtig, Teile gleichzeitig zu lernen, um die Web-App-Programmierung besser zu verstehen. Wenn Sie an Desktop-Apps arbeiten, ist dies möglicherweise nicht so wichtig, es sei denn, Sie müssen mehrere Threads ausführen
quelle
Erfahren Sie mehr über Betriebssysteme. Lesen Sie den Quellcode von Schedulern und Gerätetreibern. sie sind definitiv gleichzeitig.
quelle