Super_carotte | Bonjour,
La, je bloque vraiment. Je fait un code qui utilise Parallel:ForkManager afin de pouvoir lancer des processus fils.
Ce que je voudrai, c'est que mes processus fils puissent modifier (en fait supprimer une case) un tableau qui est dans le main().
J'ai vu ces deux sujets:
ici et la
Mais je n'y comprend pas grand chose. Ces bibliothèques sont bien complexe. Exemple de ce que je souhaiterai:
Code :
- #!/opt/perl/bin/perl
- use strict;
- use warnings;
- use ForkManager;
- my $pm = Parallel::ForkManager->new(10); #nombre de processus max
- $pm->run_on_finish( sub {
- printf "%s : Process completed: @_\n", scalar localtime
- });
- my @tableau1=(1,2,3,4,5,6,7,8,9);
- while(@tableau1 n'est pas vide) {
- foreach(@tableau1){
- $pm->start($i) and next;
- supprimer l'element en cours de lecture de @tableau1
- $pm->finish;
- }
- }
- printf "%s: Waiting for some child to finish\n", scalar localtime;
- $pm->wait_all_children;
- printf "%s: All processes finished.\n", scalar localtime;
|
Si quelqu'un arrive a trouver une solution a ce probleme, je lui en serait vraiment reconnaissant. (Sachant que je ne peux pas utiliser la communication par fichier car ce ne serait pas "suffisamment propre".)
Cordialement,
Benjamin
PS:
Si quelqu’un est curieux de savoir les raison de ces questions:
J’essaie de mettre en place un multi thread sur le code suivant.
Ce code simule un démarrage de Jobs de façon hiérarchisé.
Donc le code suivant fonctionne mais j'aimerai maintenant y appliquer du multi thread lors du démarrage des jobs (actuellement simulé par un "sleep rand 5;" )via la bibliothèque ForkManager.
Code :
- #!/usr/bin/perl -w
- use strict;
- use warnings;
- use diagnostics;
- use Data::Dumper;
- use Parallel::ForkManager;
- ####################### PACKAGES ###########################
- package Job;
- my @listJob = ();
- my @tabProc = ();
- sub new {
- my ($class, $ID_PROCESS, $ALIAS, $PERE, $FILS, $LOCK, $TYPE, $STARTED) = @_;
- my $this = {};
- bless($this, $class);
-
- $this->{ID_PROCESS} = $ID_PROCESS;
- $this->{ALIAS} = $ALIAS;
- $this->{PERE} = $PERE;
- $this->{FILS} = $FILS;
- $this->{LOCK} = $LOCK;
- $this->{TYPE} = $TYPE;
- $this->{STARTED} = $STARTED;
-
-
- push(@listJob,$ID_PROCESS);
- push(@tabProc,$this);
- return $this;
- }
-
-
- sub getID {
- my ($this) = @_;
- return $this->{ID_PROCESS};
- }
- sub getAlias {
- my ($this) = @_;
- return $this->{ALIAS};
- }
- sub getPere {
- my ($this) = @_;
- return $this->{PERE};
- }
- sub getFils {
- my ($this) = @_;
- return $this->{FILS};
- }
- sub getLock {
- my ($this) = @_;
- return $this->{LOCK};
- }
- 1;
- ####################### FIN PACKAGES ###########################
- ####################### MAIN ###########################
- my $pere;
- my $fils;
- my $LEVEL=0;
- $pere = undef;
- $fils = "4,5";
- my $proc1 = new Job( "1", "alias1", $pere, $fils, "0", "unknown", "0" );
- $pere = undef;
- $fils = "6";
- my $proc2 = new Job( "2", "alias2", $pere, $fils, "0", "unknown", "0" );
- $pere = undef;
- $fils = "8,9";
- my $proc3 = new Job( "3", "alias3", $pere, $fils, "0", "unknown", "0" );
- $pere = "1";
- $fils = "7";
- my $proc4 = new Job( "4", "alias4", $pere, $fils, "0", "unknown", "0" );
- $pere = "1";
- $fils = "7";
- my $proc5 = new Job( "5", "alias5", $pere, $fils, "0", "unknown", "0" );
- $pere = "2";
- $fils = "8";
- my $proc6 = new Job( "6", "alias6", $pere, $fils, "0", "unknown", "0" );
- $pere = "4,5";
- $fils = "8";
- my $proc7 = new Job( "7", "alias7", $pere, $fils, "0", "unknown", "0" );
- $pere = "7,5,6,3";
- $fils = undef;
- my $proc8 = new Job( "8", "alias8", $pere, $fils,, "0", "unknown", "0" );
- $pere = "3";
- $fils = undef;
- my $proc9 = new Job( "9", "alias9", $pere, $fils, "0", "unknown", "0" );
- print "listJob : @listJob\n";
- print Data::Dumper::Dumper @tabProc;
- foreach my $row (@tabProc)
- {
- if ($row->{PERE} eq undef)
- {
- $row->{PERE} = "NULL";
- }else
- {
- $row->{PERE} =~ s/,/ /g;
- }
- if ($row->{FILS} eq undef)
- {
- $row->{FILS} = "NULL";
- }
- else
- {
- $row->{FILS} =~ s/,/ /g;
- }
- if ($row->{PERE} eq "NULL" )
- {
- $row->{TYPE} = "PERE-0";
- }
- else
- {
- if ($row->{FILS} eq "NULL" )
- {
- $row->{TYPE} = "FILS";
- }
- else
- {
- $row->{TYPE} = "PERE";
- }
- $row->{STARTED} = 0;
- }
- $LEVEL+=1;
- }
- print Data::Dumper::Dumper @tabProc;
- print "LEVEL : $LEVEL\n";
- my $RETOUR;
- my @tabProc_temp=@tabProc;
- my @tabProcFini=();
- my $i=0;
- while( @tabProc_temp )
- {
- $i=0;
- foreach my $row (@tabProc_temp)
- {
- if ($row->{LOCK} == 0)
- {
- $RETOUR = "Not OK";
- print "PROCESS $row->{ID_PROCESS} lets work on it! \n";
- if ($RETOUR eq "OK" )
- {
- print "PROCESS","$row->{ID_PROCESS} is Running \n";
- push(@tabProcFini,$row->{ID_PROCESS});
- @tabProc_temp = @tabProc_temp[0..($i-1),($i+1)..$#tabProc_temp];
- print "\n";
- }
- else
- {
- print "PROCESS ","$row->{ID_PROCESS} is Stopped \n";
- if ($row->{TYPE} eq "PERE-0" )
- {
- sleep rand 5;
- print "PROCESS ","$row->{ID_PROCESS} well started \n\n";
- push(@tabProcFini,$row->{ID_PROCESS});
- @tabProc_temp = @tabProc_temp[0..($i-1),($i+1)..$#tabProc_temp];
- }else
- {
- my @tab1 = split(/ /,$row->{PERE});
- my $tailletab1 = scalar @tab1;
- my @tab2=@tabProcFini;
- my %hash = map{$_ => 1} (@tab1, @tab2);
- my @tab = keys %hash;
- my $nombre_elements_commun = @tab1 + @tab2 - @tab;
- if($nombre_elements_commun == $tailletab1)
- {
- print "PROCESS ","$row->{ID_PROCESS} Parents: $row->{PERE} \n";
- print "PROCESS ","$row->{ID_PROCESS} Les elements de la liste \"PERE\" du process $row->{ID_PROCESS} sont tous présents dans le tableau \@tabProcFini \n";
- sleep rand 5;
- print "PROCESS ","$row->{ID_PROCESS} well started \n\n";
- push(@tabProcFini,$row->{ID_PROCESS});
- @tabProc_temp = @tabProc_temp[0..($i-1),($i+1)..$#tabProc_temp];
- }else
- {
- print "PROCESS ","$row->{ID_PROCESS} Les elements de la liste \"PERE\" du process $row->{ID_PROCESS} NE sont PAS tous présents dans le tableau \@tabProcFini \n";
- print "PROCESS ","$row->{ID_PROCESS} Let's try another process \n\n";
- }
- }
- $RETOUR = "OK";
- if ($RETOUR ne "OK" )
- {
- print "PROCESS","$row->{ID_PROCESS} not started \n";
- exit(1);
- }
- }
- }
- else
- {
- print "$row->{ID_PROCESS} Locked !!! \n";
- push(@tabProcFini,$row->{ID_PROCESS});
- @tabProc_temp = @tabProc_temp[0..($i-1),($i+1)..$#tabProc_temp];
- print "\n";
- }
- $i++;
- #print "tabProc_temp : @tabProc_temp\n";
- print "tabProcFini : @tabProcFini\n\n";
- }
- }
|
Toutes les propositions sont les bienvenue, je sèche vraiment Message édité par Super_carotte le 13-12-2011 à 09:46:33
|