Pregunta

Estoy corriendo 40-o-so hilos con la siguiente subrutina:

my $app = shift;
my $ua = LWP::UserAgent->new();
$ua->timeout(5);
my $response = $ua->get($$app{'watch_url'});
my $new_md5;
if ($response->is_success()) {
    $new_md5 = md5_hex($response->content());
}
return ($$app{'short_name'}, $$app{'watch_md5'}, $new_md5);

Los vaciados de memoria sobrevienen aproximadamente 3/4 del tiempo. LWP y LWP :: agente de usuario son puros de Perl, por lo que yo estoy atrapado con la guardia baja por esto. Se LWP :: agente de usuario no seguro para subprocesos?

Actualización:

Esta es una versión mínima para reproducir el problema:

use strict;
use warnings;
use threads;
use LWP::UserAgent;

sub check_app {
    my $ua = LWP::UserAgent->new();
    $ua->timeout(5);
    $ua->get('http://www.flatdoc.com/?' . rand(10));
}

my @threads;
for (my $i = 0; $i < 40; $i++) {
    my $thread = threads->create(\&check_app);
    push(@threads, $thread);
}
foreach (@threads) {
    $_->join();
}
¿Fue útil?

Solución

No-seguro para subprocesos puro código Perl no provoca una violación de segmento (de hecho, no hay código de Perl puro debe causar una violación de segmento). Un error en Perl provoca una violación de segmento. Y los hilos en Perl son históricamente muy verde todavía, pero han mejorado mucho.

Su código funciona muy bien en 5.10.1, y HTTP :: Lite probablemente no lo hacen cosquillas fallo Perl le han acabado en. Probablemente sólo tiene que utilizar una nueva versión de Perl. El mayor y más cerca de RedHat que se obtiene, los hilos son menos estables. Si vas a utilizar los enlaces, use el nuevo Perl se puede obtener en sus manos.

Como alternativa a las discusiones, se puede usar algo como paralelo :: ForkManager , LWP :: paralelo o incluso la sorprendente horquillas módulo que emula hilos utilizando un tenedor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top