script de Perl Mi necesita para ejecutar múltiples hilos simultáneamente ...¿Cómo implementar la comunicación de subprocesos de semáforos en Perl?
use threads ('yield', 'exit' => 'threads_only');
use threads::shared;
use strict;
use warnings;
no warnings 'threads';
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Async;
use ...
... y tales hilos tienen que obtener alguna información de la web, por lo que se utiliza HTTP::Async
.
my $request = HTTP::Request->new;
$request->protocol('HTTP/1.1');
$request->method('GET');
$request->header('User-Agent' => '...');
my $async = HTTP::Async->new(slots => 100,
timeout => REQUEST_TIMEOUT,
max_request_time => REQUEST_TIMEOUT);
Sin embargo, algunos temas necesitan acceder a la web sólo cuando otro hilo (s) lo dice.
my $start = [Time::HiRes::gettimeofday()];
my @threads =();
foreach ... {
$thread = threads->create(
sub {
local $SIG{KILL} = sub { threads->exit };
my $url = shift;
if ($url ...) {
# wait for "go" signal from other threads
}
my ($response, $data);
$request->url($url);
$data = '';
$async->add($request);
while ($response = $async->wait_for_next_response) {
threads->yield();
$data .= $response->as_string;
}
if ($data ...) {
# send "go" signal to waiting threads
}
}
}, $_);
if (defined $thread) {
$thread->detach;
push (@threads, $thread);
}
}
Puede haber uno o más hilos esperando para señal "ir" y puede haber uno o más hilos que dicha señal de "ir" puede enviar . Al principio, el estado del semáforo es "wait" y una vez que pase a "vaya", se mantendrá así.
Finalmente, la aplicación comprueba el tiempo máximo de funcionamiento. Si los hilos se están ejecutando demasiado tiempo, se envía una señal de auto-terminación.
my $running;
do {
$running = 0;
foreach my $thread (@threads) {
$running++ if $thread->is_running();
}
threads->yield();
} until (($running == 0) ||
(Time::HiRes::tv_interval($start) > MAX_RUN_TIME));
$running = 0;
foreach my $thread (@threads) {
if ($thread->is_running()) {
$thread->kill('KILL');
$running++;
}
}
threads->yield();
Ahora al grano. Mis preguntas son:
Cómo puedo más eficaz código de espera "semáforo" en la secuencia de comandos (ver comentarios en la escritura anterior). ¿Debería simplemente usar solo la variable compartida con algún dummy
sleep
loop?¿Es necesario añadir un poco de
sleep
lazo en el extremo de aplicación para dar tiempo a las discusiones para la autodestrucción?
hacer yo entendido bien que está utilizando HTTP independiente :: objetos asíncronas (copiado, no se comparte, por nuevos temas) para traer a lo sumo una URL a la vez por hilo? – pilcrow
@pilcrow - Sí, parece. ¿Es un desperdicio de recursos? –
Puede o no ser menos eficiente en el uso de la memoria o el tiempo, pero su verdadero drenaje es en los ciclos del programador. :) El diseño es difícil de entender, y tal vez para cambiar/extender con seguridad, porque los componentes no parecen del todo bien. – pilcrow