Warum sollte ich die gleichzeitige Programmierung kennen?


17

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?


3
Ich denke, es ist etwas verkehrt, aber es kann etwas verkehrt werden, wenn Sie alle persönlichen Dinge herausschneiden (obwohl die gleichzeitige Programmierung für alle ziemlich schwierig ist ) und nach den konkreten technischen Vorzügen der Konzepte fragen.
Yannis

1
Die Vorteile sollten offensichtlich sein. Sie können Programme schreiben, die alle Leistungsverbesserungen nutzen, die durch die Arbeitsteilung bei gleichzeitiger Programmierung möglich sind. Es ist für niemanden einfach. Es ist heute ein sehr herausforderndes Konzept.
Rig

3
Wir können Ihnen nicht helfen, die Motivation zu finden, etwas zu lernen, aber die allgemeine Frage, warum man etwas über Parallelität wissen sollte, ist thematisch genug.

2
Ich kenne gleichzeitige Programmierung. Ich kann sagen, dass die Folie, die Sie zur Verfügung stellen, nicht zum Verständnis beiträgt. Besuchen Sie stattdessen eine Party mit Philosophen .
Mouviciel

1
Entspannen Sie sich, auch die Größten finden es schwierig: informit.com/articles/article.aspx?p=1193856
SK-logic

Antworten:


32

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.


1
Obwohl ich im Prinzip zustimme, 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).
ein Lebenslauf vom

1
OK - das ist ein bisschen übertrieben, aber neue Hardware ist in der Regel mehrkernig. Ich sehe nicht, dass das weggeht. Wenn Sie heute Student sind und über die Arbeit nachdenken, die Sie in Zukunft professionell erledigen werden, können Sie davon ausgehen, dass Sie an Multicore-Systemen arbeiten werden.
ObscureRobot

Ich frage mich, ob ich mit Ihrer Antwort so wenig einverstanden bin, wie Sie mit meiner nicht einverstanden wären.

1
So wie ich es lese, gibt es einen Kern von Ähnlichkeit mit dem, was wir beide sagen, @ acidzombie24. Ich sage, dass ein Entwickler wissen sollte, wie man mit Parallelität umgeht, weil es überall sein wird. Sie sagen, dass Sie nicht gut im gleichzeitigen Programmieren sein müssen, solange Sie ... die Fallstricke von gleichzeitigen Systemen vermeiden :)
ObscureRobot

Ich bin damit einverstanden, dass es sehr nützlich ist, Parallelität zu kennen, aber nicht einverstanden zu sein, dass Sie nur wegen "winziger, einfacher Probleme" davon wegkommen können. Sie können sich auch in nicht trivialen Systemen von der Parallelität lösen, wenn Sie sich beispielsweise auf vorhandene Frameworks und Anwendungsserver verlassen. Sobald die Infrastruktur eingerichtet ist, kann ich als Junior-Entwickler neue Dienste für eine Web-App schreiben und weiß fast NICHTS über Parallelität oder Parallelität.
Andres F.

21

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.


1
@Zachary K: Gibt es Ansätze, bei denen funktionale Sprachen mit Muttersprachen gemischt werden, sodass rechenintensive Teile in der Muttersprache implementiert werden, die jedoch Schnittstellen bieten, die von einem in funktionaler Sprache geschriebenen Server verwendet werden können?
Rwong

Nicht 100% sicher, aber sowohl Clojure als auch Scala existieren auf der JVM, also würde ich hier anfangen. Vielleicht werfen Sie einen Blick auf das Akka-Framework. Ich habe es nicht benutzt, habe mir aber vor einiger Zeit ein Gespräch über Akka angehört und es scheint, als wäre es ziemlich cool. Im Moment mache ich Erlang und Javascript, was den größten Teil meiner Zeit in Anspruch nimmt!
Zachary K

1
@rwong: Mit .NET können Programmierer C # oder andere nicht funktionale Sprachen für einige Teile ihrer Apps und F #, eine funktionale Sprache, für andere verwenden.
Kevin - Reinstate Monica

5

Weil die Nebenläufigkeit in Ihrem Gesicht explodieren kann, wenn Sie es am wenigsten erwarten ...


4
+100000000000000000000000000000000000000

8
Parallelität ist die neue spanische Inquisition [/ Python] [wie in: niemand erwartet ...]
ObscureRobot

1
@ObscureRobot doppelt so lustig! (die Erklärung wurde nicht benötigt :-p)
fortran

4

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.


1
Es wird um Größenordnungen größer, wenn Sie so schnell wie möglich vor Schleusen davonlaufen. Verwenden Sie STM oder Schauspieler und alles, was Sie gesagt haben, geht verloren. Das bedeutet natürlich, von Java zu Sprachen wie Scala, Erlang oder Clojure zu wechseln. (obwohl ich behaupten würde, dass dies auch eine gute Sache ist)
Zachary K

@ Zachary: Es mag eine gute Sache sein, aber wenn Sie zum Beispiel in einem .NET-Shop arbeiten, ist es nicht praktisch. STM ist möglicherweise eine Option in der Zukunft, aber im Moment ist es keine Option in den gängigen Sprachen.
Sean

Clojure läuft auf .net und es gibt F #. Ich würde wetten, dass es auch STM-Implementierungen für C # gibt.
Zachary K

3

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.


2

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


-1

Erfahren Sie mehr über Betriebssysteme. Lesen Sie den Quellcode von Schedulern und Gerätetreibern. sie sind definitiv gleichzeitig.


2
Parallelität für Programmierer bedeutet normalerweise, dass Ihre eigenen Programme in mehreren Instanzen ausgeführt werden.

Ich habe versucht zu betonen, dass Sie ohnehin kein eigenes paralleles Programm schreiben können, ohne die Details des Scheduling-Algorithmus des Betriebssystem-Kernels zu kennen.
jj1bdx

Warum nicht? Wenn Sie die Sperrmechanismen korrekt verwenden, ist der OS-Planungsalgorithmus unwichtig.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.