3 Stimmen

Ist es eine schlechte Idee, einen Multithreading-TCP-Server-Daemon in Perl zu schreiben?

Ist es eine schlechte Idee, Multithreading-Programme (insbesondere TCP-Server-Daemons) in Perl zu schreiben?

1voto

RC. Punkte 26365

Ich würde nicht sagen, dass es eine schlechte Idee ist, aber ich würde sagen, dass es viel bessere Optionen gibt, wenn es um Problembereiche geht, die Multithreading erfordern.

Eine bessere Option wäre meiner Meinung nach C/C++, aber je nach Ihren Fähigkeiten und Ihrer Erfahrung mit diesen Sprachen kann es schwierig/zeitaufwendig sein, sie zu schreiben. Mein Rat wäre, es in Perl zu schreiben (ich gehe davon aus, dass das aufgrund der Frage die Sprache Ihrer Wahl ist), und wenn es zu einem Problem wird oder Sie Leistungsprobleme haben, dann sollten Sie sich überlegen, ob Sie den Code nicht in etwas wie C/C++ übertragen wollen.

1voto

Fluffy Punkte 26266

Ja, das ist eine schlechte Idee. Hier ist ein Artikel, der beschreibt, warum das so ist: Dinge, die Sie vor der Programmierung von Perl-Ithreads wissen müssen

Hier ist nur ein Auszug aus dem oben genannten Beitrag:

Im Gegensatz zu den meisten anderen Thread-Implementierungen, die es auf der Welt gibt, einschließlich der älteren Thread-Implementierung von Perl 5.005, werden Variablen standardmäßig nicht von Perl-ithreads gemeinsam genutzt. Was bedeutet das also? Es bedeutet, dass jedes Mal, wenn Sie einen Thread starten, alle Datenstrukturen in den neuen Thread kopiert werden. Und wenn ich sage alle, dann meine ich alle. Dazu gehören z.B. Paketverzeichnisse, globale Variablen, Lexika im Gültigkeitsbereich. Einfach alles! Ein Beispiel:

use threads ();
my $foo;
threads->new( sub {print "thread: coderef = ".\$foo."\n"} )->join;
print "  main: coderef = ".\$foo."\n";

der dies auf meinem System ausgibt:

thread: coderef = SCALAR(0x1eefb4)
  main: coderef = SCALAR(0x107c90)

Aber halt, werden Sie sagen, gemeinsame Variablen sind vielleicht viel besser. Warum mache ich also nicht alle Variablen in meiner Anwendung gemeinsam nutzbar, damit ich nicht darunter leide? Nun, das ist falsch. Warum? Weil gemeinsam genutzte Variablen in Wirklichkeit gar keine gemeinsam genutzten Variablen sind. Gemeinsame Variablen sind in Wirklichkeit gewöhnliche gebundene Variablen (mit all den Vorbehalten und Leistungsproblemen, die mit gebundenen Variablen verbunden sind), auf die etwas "Magie" angewandt wurde. Gemeinsam genutzte Variablen benötigen also nicht nur die gleiche Menge an Speicher wie "normale" Variablen, sondern auch zusätzlichen Speicher aufgrund der damit verbundenen "Magie". Das bedeutet auch, dass Sie keine gemeinsam genutzten Variablen haben können, die mit Ihrer eigenen Magie verbunden sind (es sei denn, Sie möchten mein Thread::Tie-Modul verwenden).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X