¿Utiliza casos para ithreads (hilos de intérprete) en Perl y justificación para usarlos o no?
Si quieres aprendercóm para usar hilos de intérprete de Perl, hay buena documentación enperlthrtut
(tutorial de hilos) yelthreads
pragma manpage. Definitivamente es lo suficientemente bueno para escribir algunos guiones simples.
Sin embargo, he encontrado poca orientación en la web sobrepor qu yqu para usar sensiblemente los hilos de intérprete de Perl. De hecho, no se habla mucho de ellos, y si la gente habla de ellos, con bastante frecuencia se desalienta a las personas a usarlos.
Estos hilos, disponibles cuandoperl -V:useithreads
esuseithreads='define';
y desatado poruse threads
, también se llaman ithreads, y tal vez de manera más adecuada, ya que son muy diferentes de los subprocesos ofrecidos por los sistemas operativos Linux o Windows o la VM de Java en que nada se comparte de manera predeterminada y, en cambio, se copian muchos datos, no solo la pila de subprocesos , aumentando significativamente el tamaño del proceso. (Para ver el efecto, cargue algunos módulos en un script de prueba, luego cree subprocesos en un bucle haciendo una pausa para presionar las teclas cada vez, y observe cómo aumenta la memoria en el administrador de tareas otop
.)
[...] cada vez que inicia un hilo, todas las estructuras de datos se copian en el nuevo hilo. Y cuando digo todo, me refiero a todo. Esto por ejemplo incluye paquetes escondidos, variables globales, léxicos en alcance. ¡Todo
- Cosas que necesita saber antes de programar hilos de Perl (Perlmonks 2003)
Al investigar el tema de los hilos de Perl, verá personas que lo desaniman de usarlos "idea extremadamente mala", "fundamentalmente defectuoso" o "nunca use ithreads para nada").
El tutorial de subprocesos de Perl destaca que "Los subprocesos de Perl son diferentes", pero no se molesta mucho 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 esdesde elCoro
página de manual bajo el encabezado EMULACIÓN DE PROCESO DE VENTANAS. El autor de ese módulo Coro: los únicos hilos reales en perl) también desalienta el uso de hilos de intérprete de Perl.
En algún lugar leí que compilar perl con hilos habilitados resultará en un intérprete significativamente más lento.
Hay una página de Perlmonks de 2003 Cosas que debes saber antes de programar Perl ithreads), en el que el autor pregunta: "¿Ahora se preguntarán por qué los hilos de Perl no utilizaron fork ()? ¿No habría tenido mucho más sentido?" Esto parece haber sido escrito por el autor de laforks
pragma. No estoy seguro de que la información proporcionada en esa página siga siendo válida en 2012 para los nuevos Perls.
Aquí hay algunas pautas para el uso de hilos en Perl que he destilado de mis lecturas (tal vez erróneamente):
Consider usando IO sin bloqueo en lugar de hilos, como conHTTP::Async
oAnyEvent::Socket
oCoro::Socket
.Consider usando hilos de intérprete de Perl solo en Windows, no en UNIX porque en UNIX, los tenedores son más eficientes tanto para la memoria como para la velocidad de ejecución.Cree hilos al comienzo del programa, no cuando la carga de memoria ya es considerable - vea "forma ideal de reducir estos costos" enperlthrtut
. Minimizar la comunicación entre hilosporque es lento (todas las respuestas en esa página).Hasta ahora mi investigación. Ahora, gracias por cualquier otra luz que pueda arrojar sobre este tema de hilos en Perl. ¿Cuáles son algunos casos de uso sensatos para ithreads en Perl? ¿Cuál es la razón para usarlos o no?