• Publicidad

Problema con multihilo

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Notapor fgalves » 2006-10-16 04:34 @232

Muy buena indicacion. TE puedo confirmar que:
- la variable $flatValidLines es incrementada por los 4 procesos con la funcion printFlatDecodedLine
- la funcion que sirve para imprimir dicha variable (printFlatReport)

Sigo investigando...
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor fgalves » 2006-10-16 04:38 @235

perdon...
quise decir:

- la funcion que sirve para imprimir dicha variable (printFlatReport) sigue imprimiendo a cero dicha variable.
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2006-10-16 04:45 @239

Aqui os enseño la función a la que se llama para imprimir todos los reports.
Es decir, desde esta función, se llama a la función printFlatReport, ya que Outbrs.pm es una instancia de flatProjection (un report concreto):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub printReports {
    my $globalParams = $_[0];
    my $reportHeader = $_[1];

    my $status = 0;

    if (defined $xmlProjections[0]) {
        foreach my $xmlProjection (@xmlProjections) {
            $status = $xmlProjection->printXMLReport($globalParams, $reportHeader);
            if ($status != 0) {
                &Logger::logError("$xmlProjection XML report was not properly created.\n");        
            }            
        }
    }
    if (defined $flatProjections[0]) {
        foreach my $flatProjection (@flatProjections) {
            $status = $flatProjection->printFlatReport($globalParams, $reportHeader);
            if ($status != 0) {
                &Logger::logError("$flatProjection Flat report was not properly created.\n");        
            }            
        }
    }
    return $status;
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2006-10-16 06:54 @329

El meollo de la cuestión está en cómo conservar el valor de $flatValidLines.
Dicha variable es incrementada en paralelo por muchos procesos (forks), pero cada uno de forma independiente.
Lo que no puedo hacer es bloquearla con un semáforo, porque retardaría enormemente el tiempo de ejecución.
He probado de declarar otra variable global y ir incrementando con el valor de $flatValidLines, pero dicha variable también vale 0 al final.
¡¡¡Que rollo de problema!!!!
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2006-10-16 07:15 @344

Es que es natural que al ser foks, los procesos incrementen la variable de forma independiente.
Cuando dices final, ¿a qué te refieres? ¿a la ejecución de todos los procesos o de sólo el padre? Si el padre no participa en el proceso general, es normal que sus variables siempre sean 0.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor fgalves » 2006-10-16 11:34 @524

¡¡¡¡PROBLEMA RESUELTO!!!!
¡¡¡Muchisimas gracias a todos por vuestra colaboración!!!
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor Perl user » 2006-10-16 12:29 @562

Que tal,

Revisando un poco tu código ( que aun no logro comprender tanto ), veo que muy buena parte de tu problemita es cuestión de diseño...

Te explico:

- Tal parece que todas las funciones que usas no son exportadas a tu espacio de nombres actual, todo lo haces accediendo indirectamente a la función por medio del paquete ( eso podría provocarte algunos fallos de seguridad ).
La recomendación es que verifiques como crear módulos y como exportar los símbolos que nada mas requieras.

- veo por allí que mandas un contador a una funcion que ( creo... ) genera una lista de lo que tienes que esperar? no lo sé, se me hace innecesario...
Para esperar por tus procesos hijos ( sin importar cual ) basta con utilizar waitpid( -1, WNOHANG ) como te lo indiqué en un post anterior, de esa manera no te tienes que preocupar por los pids del todo, deja que el sistema lo haga.

- De la misma manera, en un comentario que hice hace días te comentaba sobre sincronización de información, algo que estás ignorando en el código que me muestras... No tienes nada de sincronización para acceder al contador que tienes, no le hagas tanta confianza al scheduler del sistema, es dificil de entender en cuanto a su funcionamiento. Utiliza algo como shared memory o semaforos para sincronizar eso.

Y bueno, no he visto la mayor parte del código, pero eso es principalmente lo que noto de fallo, y en conclusión se resume a un mal diseño para algo multiprocesos (ojo, no multithread).

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor explorer » 2006-10-16 14:23 @641

Bien, funciona... ¿pero qué es lo que pasaba?
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor fgalves » 2006-10-17 03:25 @184

¡¡¡Hola a todos!!!
Siento no haber podido explicar antes el origen del problema pues ayer tenía mucha prisa y no resolví el problema hasta las 7 de la tarde, justo antes de largarme a casa. Esa es la función del foro, que sirva de ejemplo para la demás gente como yo, así que aquí estoy para explicaros brevemente lo que pasaba.
De hecho, tal y como dice nuestro amigo "Perl User", se trataba de un problema de diseño. La variable $flatValidLines era incrementada correctamente por cada proceso hijo, y en el propio Perl module donde dicha variable estaba declarada, existía una función que se encargaba de incrementar dicha variable tomando en cuenta el resultado obtenido por los demás procesos hijos.
El problema: dicha función nunca era llamada a nivel superior, es decir, simplemente no era usada.
De hecho, no he sido yo el que ha diseñado dicha aplicación; yo soy nuevo en la empresa, acabo de llegar hace un mes y me encuentro con toda esa maraña de funciones y expresiones raras en un lenguaje que yo jamás había utilizado.

Pero bueno, por fin está arreglado y ahora toca continuar y seguir arreglando otros problemas que vendrán.

Un saludo y gracias a todos por la ayuda e interés.
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados