Hola expertos.
He decidido responder a este mensaje que he encontrado en el foro, ya que el título sería igual que el que yo pondría y con el fin de evitar duplicación de problemas respecto al mismo tema, pues respondo a este mensaje del 2006. Si hago mal en este sentido, hacédmelo saber. ¡Gracias!
Por otro lado, veo que ese de nivel "intermedio". Quiero pedir disculpas de antemano por mi atrevimiento. Siendo una novata, no sé si tengo derecho a escribir fuera del "básico".
Bien, expondré mi duda respecto a utilizar un servidor como un
thread, que con la sobredosis de información que me he metido no acabo de entender el porqué de la cuestión.
Aquí está el código básico que engloba dos
threads trabajando en paralelo. Uno inicia un servidor que recibirá señales (requets) y el otro
thread que trabajará en paralelo realizando x tareas tras haber detectado que se recibieron señales en el servidor.
Para implementar el servidor estoy utilizando HTTP::Server::Simple por imposición. No puedo elegir aquí.
Ambos
threads comparte la variable "signal" que será su modo de comunicación.
Using perl Syntax Highlighting
#!/apps/essbase9/perl/bin/perl
#declare packages
use threads
();
use threads
::shared ();
my $signal : shared
= 0;
my $countSignals = 0;
my $countExecutions = 0;
my @http_params = '';
my @partition_params = '';
my $timestamp = `date '+%d/%m/%y%H%M%S'`;
package MyWebServer
;
use base
qw(HTTP
::Server::Simple::CGI);
sub handle_request
{
my ($self, $cgi) = @_;
lock
($signal);
if ($signal eq 0
){
$signal = 1;
}
$countSignals++;
print "contador señales: $countSignals";
print "\n $timestamp receiving signal";
}
my $httpPublisher = threads
->new(\&listenToSignal, @http_params);
my $httpConsumer = threads
->new(\&updateCube, @partition_params);
my @returned_data_http = $httpPublisher->join;
my @returned_data_update = $httpConsumer->join;
sub listenToSignal
{
while ('para siempre') {
MyWebServer
->new(8084
)-> run();
}
}#end sub
sub updateCube
{
while ('para siempre') {
lock
($signal);
if ($signal > 0){
# lock($signal);
$signal = 0;
$countExecutions++;
print "\ncontador updates: $countExecutions";
print "\n $timestamp starting updateCube thread";
sleep 5; #code for tasks comes here
print "\n $timestamp finishing updateCube thread";
}#end if signal yes
}#end while forever
}#end thead update cubeColoreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Exposición del problema:
El programa trabaja perfectamente si ninguno de los
threads tarda en ejecutarse. Es decir, si quitamos la instrucción "sleep" del
thread "httpConsumer" trabaja de miedo, pero en cuanto este
thread se toma su tiempo (sleep 5) que será lo que ocurra en la realidad el servidor peta al recibir sucesivas
requests (si hacemos
requests cada 5 segundos sigue funcionando bien).
He hecho un montón de combinaciones y permutaciones del orden de ejecución de las instrucciones pero no parece ser el problema...
Pregunta:
¿Por qué ocurre esto?
¿Estoy haciendo algo mal verdad?
¡Muchas gracias!