2012-09-21 6 views
6

Perl's documentation mówi: Ponieważ Perl 5.8, programowanie wątek jest dostępna przy użyciu modelu o nazwie tłumacza wątki który dostarcza nowego Perl interpretera dla każdego wątkuJak działa system gwintowania Perl?

Korzystanie ps -Lm <pid> z programem poniżej widzę, że nici biegną równolegle tzn. są one uruchamiane w tym samym czasie w różnych rdzeniach. Ale nawet jeśli istnieją 4 wątki (3 i główne) ps aux pokazuje tylko jeden proces Perla.

  1. Czy to znaczy, że istnieje cała Perl interpreter na każdego wątku?
  2. Czy Perl wątki odwzorowane na wątków systemowych?
  3. Jeśli 2 jest prawdziwe, jak można mieć wielu tłumaczy Perla w ramach jednego procesu?
use threads; 

$thr = threads->new(\&sub1); 
$thr2 = threads->new(\&sub1); 
$thr3 = threads->new(\&sub1); 

sub sub1 { 
     $i = 0; 
     while(true){ 
     $i = int(rand(10)) + $i; 
     } 
} 


$thr->join; 
+0

http://stackoverflow.com/questions/9973860/use-cases-for-ithreads-interpreter-threads-in-perl-and-rationale-for-using-or – user454322

+2

Zalecam, aby przeczytać [to] (http://www.perlmonks.org/index.pl?node_id=288022) przed użyciem "Gwinty Perla" w dowolnym projekcie. – PSIAlt

+0

Co więcej w perlu 5.20 Uwagi do wydania: Zinterpretowane wątki interpretera są teraz odradzane "Tłumacz" wątki bazujące "dostarczone przez Perl nie są szybkim, lekkim systemem do wielozadaniowości, którego można się spodziewać lub mieć nadzieję. Wątki są implementowane w sposób, który ułatwia ich niewłaściwe użycie. Niewiele osób wie, jak z nich korzystać poprawnie lub będzie w stanie udzielić pomocy. – Rob11311

Odpowiedz

10

"Perl tłumacza" odnosi się do środowiska, w którym kod jest wykonywany Perl. Z punktu widzenia użytkownika, to głównie tabela symboli i globale w niej zawarte, ale zawiera również mnóstwo wewnętrznych zmiennych (np. Tych używanych podczas analizowania, bieżącego op itd.).

  1. Tak, dla każdego wątku jest interpreter języka Perl.

  2. Tak, gwinty Perla są wątkami systemowymi.

  3. Wyobraź sobie "interpretera Perla" jako klasę, z której możesz wykonać dowolną liczbę wystąpień. * Perl określa to jako Multiplicity. Aby uzyskać informacje na temat osadzania interpretera Perl w aplikacji, zobacz artykuł perlembed.


* — Wymaga użycia -Dusemulitplicity przy budowie Perl, która stanowi założoną przez -Dusethreads, który jest jak nić wsparcie jest dodawany do Perl. W przeciwnym razie zamiast "klasy" używana jest cała gromada globali.

6

Aby wzmocnić odpowiedź ikegami na trzecie pytanie, Perl tworzy kompletną kopię całego stanu interpretatora dla każdego wątku systemu operacyjnego. Oznacza to, że wszystkie dane i kod są kopiowane. Z drugiej strony powoduje to spowalnianie wątków, a wątki Perla są głodne pamięci.

W górnej części wątki są odizolowane od siebie, co znacznie ułatwia pisanie kodu wątku. Na przykład, większość modułów jest z natury bezpieczna dla wątków, bez konieczności czynienia przez autora żadnych specjalnych zadań lub w ogóle nie myślenia o wątkach.

To jest druga implementacja wątku Perla. Pierwszy wątek 5,005 był bardziej tradycyjnym modelem wątków, w którym wątki udostępniały kod i zmienne globalne. To nie działało zbyt dobrze. Co gorsza, większość modułów CPAN uczyniła bezużytecznymi, ponieważ nieskoordynowane zmienne globalne ścierały się ze sobą między różnymi wątkami.

Jak to jest możliwe, jest rzecz zwana "wielością", którą ikegami wspomina i wyjaśnia. Wynikało to pierwotnie z pragnienia osadzenia interpretera Perla w innym programie C lub C++. Wymagało to zmiany sposobu działania Perla, więc izoluje wszystkie dane globalne (zmienne globalne i skompilowany kod) na obiekt tłumacza, zamiast zakładać, że jest to jedyny interpreter Perla uruchomiony w tym procesie. Stamtąd wielokrotność wielu interpreterów Perla w interprerze Perla została użyta do emulacji fork w systemie Windows. Ostatecznie 5,6 wątków zbudowanych na bazie tej obszernej pracy.