• Publicidad

Problema con multiprocesos y repartición de tarea

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

Problema con multiprocesos y repartición de tarea

Notapor fgalves » 2007-05-14 01:29 @103

Hola a todos,

El caso es que tengo un array @files_to_be_restored que contiene una lista de nombre de ficheros:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@files_to_be_restored = (file1, file2, file3, ..., fileN);
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Trabajando en multiproceso, tengo un número P de procesos que deben procesar dicha lista, pero cada proceso debe procesar únicamente los ficheros de la parte que le corresponde.

Es decir, supongamos que tengo 6 procesos. La lista @files_to_be_restored anterior debe ser repartida, y cada proceso debe trabajar únicamente sobre los ficheros que le han sido atribuidos.

Es ahí donde radica la dificultad, ya que no sé cómo repartir dichos ficheros entre los diferentes procesos de manera equitativa.

De momento llevo hecho lo siguiente:


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 # number of files to be restored
    my $numberOfFiles = $#files_to_be_restored;
   
    my $MAXNUMBEROFTHREADS = 6;
    my $filesPerProcess = $numberOfFiles/$MAXNUMBEROFTHREADS;
    my $numberOfChilds = 0;
    my $firstIndexFile = 0;
    my $lastIndexFile = 0;

    # Creates sub-processes and assign to each one a subset of fields to be rescued
   
   
if ($MAXNUMBEROFTHREADS > 0 )
    {
       
        $numberOfChilds++;
        # Start a child process
        my $val = fork();
       
        # the child process
        if ($val == 0)
        {
            #el proceso hijo tiene una copia de la lista de ficheros total, @files_to_be_restored
            #obtain subset of files to be restored
            $firstIndexFile = ($numberOfChilds-1)*$filesPerProcess;
            $lastIndexFile = $firstIndexFile + $filesPerProcess;
            #en @files_to_be_restored necesito tener unicamente la parte que le corresponde al proceso en cuestion
            @files_to_be_restored = @files_to_be_restored[$firstIndexFile..$lastIndexFile];
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

¿Alguien me puede echar una manita? ¿Estoy planteando el problema de forma correcta?
¡Gracias por adelantado!
¡Saludos!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor explorer » 2007-05-14 09:56 @455

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use POSIX ":sys_wait_h";              # Lo necesitamos por una constante para waitpid
use strict;
use warnings;

$|++;                                 # Salida inmediata a pantalla

# Datos
my @ficheros_a_procesar = qw(
    uno dos tres cuatro cinco
    séis siete ocho nueve diez
    once doce trece catorce quince
    dieciséis diecisiete dieciocho diecinueve veinte
);
my $numero_de_hijos   = 6;

# Calculamos los ficheros por hijo, de forma somera
my $ficheros_por_hijo = int( @ficheros_a_procesar / $numero_de_hijos );

# En caso de que no nos interese esperar por la muerte de los hijos,
# podemos indicar aquí que es lo que debe ocurrir cuando eso suceda
#$SIG{CHLD} = 'IGNORE';

# Procesamiento
my @ficheros = @ficheros_a_procesar;
foreach my $hijo ( 1 .. $numero_de_hijos ) {           # Para todos los hijos

    # A cada hijo le damos una parte excepto el último hijo, que procesará su parte más lo que quede
    my @f = ( $hijo eq $numero_de_hijos )
          ? splice(@ficheros)
          : splice(@ficheros, 0, $ficheros_por_hijo )
          ;

    # Parto
    if ( fork ) {
        # El padre
        # No hace nada
    }
    else {
        # El hijo
        # Procesa su parte
        print "$$: @f";
        exit;
    }
}

# Esperamos la muerte de todos los hijos (tragedia)
my $hijo_aun_vivo;
do {

    $hijo_aun_vivo = waitpid(-1,WNOHANG);

} while ( $hijo_aun_vivo > 0 );
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Una posible salida es:
Código: Seleccionar todo
explorer@casa:~/Documents/Software/Perl> ./kk.pl
14754: uno dos tres
14755: cuatro cinco séis
14756: siete ocho nueve
14757: diez once doce
14758: trece catorce quince
14759: dieciséis diecisiete dieciocho diecinueve veinte
explorer@casa:~/Documents/Software/Perl>
Más información en perlipc.
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


Volver a Básico

¿Quién está conectado?

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