Si desea aprender cómo usar hilos de intérprete Perl, hay buena documentación en perlthrtut
(threads tutorial) y the threads
pragma manpage. Definitivamente es lo suficientemente bueno para escribir algunos scripts simples.¿Casos de uso para ithreads (hilos de intérprete) en Perl y razones para usarlos o no?
Sin embargo, he encontrado poca orientación en la web en qué y lo utilizar con sensatez hilos intérprete de Perl para. De hecho, no se habla mucho de ellos, y si la gente habla de ellos, con frecuencia es para desalentar a las personas a usarlos.
Estos hilos, disponible cuando perl -V:useithreads
es useithreads='define';
y desatada por use threads
, también son llamados iThreads, y tal vez más apropiadamente de modo ya que son muy diferentes de hilos como los ofrecidos por los sistemas operativos Linux o Windows o la máquina virtual de Java en que no se comparte nada por defecto y en su lugar se copian muchos datos, no solo la pila de subprocesos, lo que aumenta significativamente el tamaño del proceso. (Para ver el efecto, cargar algunos módulos en un script de prueba, a continuación, crear hilos en un bucle de una pausa de pulsaciones de tecla cada vez, y ver aumento de memoria en el administrador de tareas o top
.)
[...] cada vez que inicia un hilo, todas las estructuras de datos se copian en el nuevo hilo. Y cuando digo todo, quiero decir todo. Esto p. incluye paquetes stashes, variables globales, léxicos en el alcance. ¡Todo!
- Things you need to know before programming Perl ithreads (Perlmonks 2003)
Al investigar el tema de iThreads Perl, verá la gente que desalentar el uso de ellos ("extremely bad idea", "fundamentally flawed", o "never use ithreads for anything").
The Perl thread tutorial highlights that "Perl Threads Are Different", pero no se molesta en explicar cómo son diferentes y qué significa eso para el usuario.
Una explicación útil pero muy breve de lo que realmente son los hilos es from the Coro
manpage under the heading WINDOWS PROCESS EMULATION. El autor de ese módulo (Coro - los únicos hilos reales en perl) también desalienta el uso de hilos de intérprete Perl.
En algún lugar he leído que la compilación de Perl con subprocesos habilitados dará como resultado un intérprete significativamente más lento.
Hay una página de Perlmonks de 2003 (Things you need to know before programming Perl ithreads), en la que el autor pregunta: "Ahora se puede preguntar por qué Perl ithreads no usó fork()? ¿No habría tenido mucho más sentido?" Esto parece haber sido escrito por el autor del pragma forks
. No estoy seguro de que la información que figura en esa página aún sea cierta en 2012 para los Perls más nuevos.
Aquí hay algunas pautas para el uso de hilos en Perl he destilados de mis lecturas (tal vez erróneamente): por lo
- Considere el uso de no bloqueo IO en lugar de hilos, al igual que con
HTTP::Async
, oAnyEvent::Socket
, orCoro::Socket
. - Considere usar los hilos de intérprete Perl on Windows only, not on UNIX because on UNIX, forks are more efficient both for memory and execution speed.
- Crear subprocesos al comienzo del programa, no cuando la memoria ya es considerable: consulte "ideal way to reduce these costs" in
perlthrtut
. - Minimiza la comunicación entre los hilos because it's slow (todas las respuestas en esa página).
Hasta ahora mi investigación. Ahora, gracias por más luz que puede arrojar sobre este tema de hilos en Perl. ¿Cuáles son algunos casos de uso sensato para ithreads en Perl? ¿Cuál es la razón para usar o no usarlos?
Gracias! Esta es la instrucción de uso más detallada para los hilos de Perl que he visto hasta la fecha. - En mi pregunta, indiqué que el * cómo * de usar ithreads está cubierto, mientras que el * por qué * y * qué para * están ausentes. Pensando más en esto, el * cómo *, el * por qué * y el * qué para * están estrechamente relacionados, y en realidad el * cómo * no ha sido lo suficientemente preciso (para los usuarios comunes de Perl como yo) para responder el * por qué * y para qué*. - Esta respuesta es un paso adelante. Gracias de nuevo. – Lumi
"Todavía son mejores que los hilos de Python". - ¿Puede explicar esto? Por favor, es muy interesante – nordicdyno
Principalmente se trata de Python GIL en la mayoría de las implementaciones (predominantemente cpython pero otras en menor extensión). Básicamente, significa que los subprocesos del sistema operativo en Python no pueden ejecutar el trabajo de la CPU al mismo tiempo, lo que los anula por completo. Puede usarlos (subprocesos de Python) para hacer que la E/S sea un poco más simultánea, pero es más fácil usar API orientadas a eventos para hacer eso. –