Thread Multitasking mit Perl (7 answers)
Opened by blue-dev at 2008-03-22 17:50

sid burn
 2008-03-23 03:21
#107388 #107388
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Generell gibt es drei Möglichkeiten um Multitasking zu erreichen. Thread, Forking und Multiplexing.
Alle drei haben Ihre Vor/Nachteile.

Forking ist wohl das urgestein. Mit fork() clonst du du deinen aktuellen Prozess der an der selben stelle fortfährt wo du fork() aufgerufen hast.

Mit Threading erstellst du mehrere Arbeitende Threads innerhlab eines Prozesses.

Und mit Multiplexing schaust du das deine Applikation nirgendswo im Blocking gerät, oder besser gesagt nur ein kontrolliertes blocking. Und dann nur wenn etwas vorhanden ist deine Applikation etwas tut. select() wie murphy sagte ich hier der Schlüssel, obwohl ich hier eher IO::Select empfehlen würde. Das ist deutlich einfacher.


Forking:
Vorteile:
- Ich würde es als einfach in der Programmierung betrachten. Du musst wenig beachten dafür.

Nachteile:
- Die Kommunikation unterhalb der Prozesse ist etwas schwieriger.
- In der Regel verbraucht es mehr Speicher und ist etwas langsamer als Threading.
- Funktioniert unter GNU/Linux, BSD, Unix sehr gut, alelrdiengs nicht unter Windows.


Threading:
Vorteile:
- Schneller und weniger Speicherverbrauch als Forking
- Leichtere Kommunikation, und Datenaustausch da alle Threads auf die selben Daten zugreifen können.

Nachteile:
- komplexer in der Programmierung da durch den gemeinsamen Datenaustausch schwer zu findende Fehler auftreten können. Sogenannte Race Condition die von der Reihenfolge der Ausführung abhängt. Um diese art von Fehler zu vermeiden musst du den Zugriff auf Variablen/Ressourcen locken. Dieses entfällt bei Forking.
- Durch den ersten nachteil ist somit nicht jede Bibliothek ist Threadsicher. Bibliotheken müssen extra Programmiert werden damit sie Threadsicher sind. Auch dies entfällt bei Forking.
- In Perl ist Threadsupport so lala eingebaut. Zwar ist der neue Moderne Threadsupport besser als der alte, allerdiengs ist dieser immer noch anders als man es eigentlich von Threading erwartet.


Multiplexing:
Vorteile:
- Ist in der Regel am platformunabhängigsten.
- Sollte wohl weniger Ressourcen, Speicher als Threading verbrauchen.

Nachteile:
- Erfordert den größten aufwand in der Programmierung.
- Multiplexing regelt nur das zu keinem Zeitpunkt I/O Blockt so das ein gefühl für Multitasking entsteht. Oft ist es auch das was man möchte, z.B. bei Servern. Allerdiengs wenn du etwas anderes machen möchtest ist Multiplexing eventuell dafür nicht geeignet.
- Threading oder Forking sollten Performanter sein.


EDIT:
Ach ganz vergessen. Bei solchen Sachen solltest du dir Eventuell mal POE anschauen. Das ist genau für solche Sachen gedacht und ist praktisch die vierte Möglichkeit. ;)

http://poe.perl.org/



Hmm für forking weiß ich derzeit gar nicht was man da für offene Doku gibt. Zumindest kenne ich das Buch "Netzwerkprogrammierung mit Perl" das sich komplett um Multitasking dreht. Dort wird auch fork() genauer erklärt und auf was es generell alles zu beachten gibt.

Eventuell kann dir auch http://perldoc.perl.org/perlipc.html helfen.
Dieses hier ist nur Interessant für Systeme die kein fork() als Systemaufruf besitzen. z.B. Windows: http://perldoc.perl.org/perlfork.html

Für Threading gibt es:
http://perldoc.perl.org/perlthrtut.html
http://perldoc.perl.org/threads.html

Für Multiplexing wüste ich ebenfalls wenig Doku. Nur dieses hier was etwas knapp ist.
http://perldoc.perl.org/IO/Select.html



Aber eins frage ich mich die ganze Zeit dann doch:
Quote
Ich will als Einstieg einen kleinen Chat schreiben um mich mit der Abstraktion von Client und Server unter Perl vertraut zu machen.
Den Server habe ich bereits fertig und er gibt auch bereits Chat messages zurück und kann welche empfangen, aber wie bekomme ich Perl dazu das man gleichzeitig über <STDIN> etwas schreiben kann, und neue Nachrichten bekommt, also Perl zwei Aktionen gleichzeitig macht?

Wie kann dein Server schon fertig sein wenn du nicht weißt wie du zwei Aktionen gleichzeitig ausführen kannst, bzw du generell nichts von Multitasking weißt? So ein Chat Server basiert doch dadrauf das du mehrere Verbindungen mit Clients aufbauen musst und mehrere Dinge gleichzeitig machst. Gerade der Server müsste voll von einen der oben genannten Techniken sein.


Btw:
Code: (dl )
use communication;

Du solltest dein modul in "Communication" abändern. (Großes C am anfang). Module in komplett kleinbuchstaben sind für Perl Reserviert.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Multitasking mit Perl