2012-09-21 11 views
6

Perl's documentation dice: Desde Perl 5.8, programación hilo ha estado disponible usando un modelo llamado hilos intérprete que proporciona un nuevo intérprete Perl para cada hilo¿Cómo funciona el sistema de roscado de Perl?

Usando ps -Lm <pid> con el siguiente programa puedo ver que los hilos se ejecutan en paralelo , es decir, se están ejecutando al mismo tiempo en diferentes núcleos. Pero incluso cuando hay 4 hilos (3 y el principal), ps aux muestra solo un proceso de Perl.

  1. ¿Quiere decir esto que hay en su conjunto Perl intérprete en cada hilo?
  2. Están hilos de Perl asignan a hilos del sistema?
  3. Si 2 es cierto, ¿cómo es posible tener múltiples intérpretes Perl en un solo proceso?
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

Sugiero leer [esto] (http://www.perlmonks.org/index.pl?node_id=288022) antes de usar "Perl threads" en cualquier proyecto. – PSIAlt

+0

Además en perl 5.20 notas de la versión: hilos basados ​​en intérpretes ahora son desalentados El "intérprete- Los subprocesos basados ​​en "proporcionados por Perl no son el sistema rápido y liviano para la multitarea que uno podría esperar o esperar. Los hilos se implementan de manera que sean fáciles de usar. Pocas personas saben cómo usarlas correctamente o podrán brindar ayuda. – Rob11311

Respuesta

10

"Perl intérprete" se refiere al entorno en el que ejecuta el código Perl. Desde la perspectiva de un usuario, esa es principalmente la tabla de símbolos y las variables globales, pero también incluye una gran cantidad de variables internas (por ejemplo, las utilizadas durante el análisis, la operación actual, etc.).

  1. Sí, hay un intérprete de Perl para cada hilo.

  2. Sí, los subprocesos de Perl son subprocesos del sistema.

  3. Piense en el "intérprete Perl" como una clase de la cual puede hacer cualquier cantidad de instancias. * Perl se refiere a esto como Multiplicity. Consulte perlembed para saber cómo incrustar un intérprete de Perl en su aplicación.


* — requiere el uso de -Dusemulitplicity cuando la construcción de Perl, que está implicado por -Dusethreads, que es cómo se añade soporte de hilos a Perl. De lo contrario, se usa un montón de globales en lugar de una "clase".

6

Para amplificar la respuesta de ikegami a su tercera pregunta, Perl crea una copia completa del estado completo del intérprete para cada subproceso del sistema operativo. Esto significa que todos los datos y el código se copian. En el lado negativo, esto hace que la creación de subprocesos sea lenta y los subprocesos de Perl tengan mucha memoria.

En el lado positivo, los hilos están aislados unos de otros, lo que hace que sea mucho más fácil escribir código de seguridad de subprocesos. Por ejemplo, la mayoría de los módulos son intrínsecamente seguros para subprocesos sin que el autor tenga que hacer nada especial o pensar en los subprocesos.

Esta es la segunda implementación de subprocesos de Perl. El primero, 5.005 hilos, era un modelo de subprocesamiento más tradicional donde los subprocesos compartían el código y las variables globales. No funcionó muy bien. Peor aún, inutilizó la mayoría de los módulos de CPAN debido a que sus variables globales descoordinadas chocaban entre sí entre los diversos hilos.

Cómo es posible una cosa llamada "multiplicidad" que ikegami mencionó y explicó. Esto originalmente surgió del deseo de insertar un intérprete Perl en otro programa C o C++. Necesitaba cambiar la forma en que funciona Perl, de modo que aísla todos sus datos globales (variables globales y código compilado) por objeto de intérprete, en lugar de suponer que es el único intérprete de Perl que se ejecuta en el proceso. A partir de allí, multiplicidad, múltiples intérpretes Perl dentro de un intérprete Perl, se utilizó para emular fork en Windows. Finalmente 5.6 hilos construidos sobre ese extenso trabajo.

Cuestiones relacionadas