SkÃ¥ne Sjælland Linux User Group - http://www.sslug.dk Forside   Tilmelding   Postarkiv   Forum   Kalender   Søg
MhonArc Dato: [Date Prev] [Kronologisk oversigt] [Date Next]   TrÃ¥d: [Date Prev] [Oversigt trÃ¥de] [Date Next]   MhonArc
 

Re: [PERL] n processer samtidig



On Mon, 26 Jun 100, Claus Ekstroem BSA wrote:

> Jeg skal lave en raekke analyser, og jeg er saa heldig at have en
> maskine med to processorer, som jeg gerne vil udnytte samtidig.
> Programmet, der udfoerer analyserne skriver konstant til midlertide
> filer i dets bibliotek, saa jeg vil gerne kunne begraense antallet af
> samtidige analyser til 2. I oejeblikket ser mit perl-script ud paa
> foelgende maade, og her analyseres hver kombination af kromosom og
> traek sekventielt. Vha fork eller threads burde det vaere muligt hele
> tiden at koere analyser paa fx. 2 kromosomer samtidig, saaledes at
> analysen at nyt traek paa et kromosom starter op saasnart den gamle
> analyse er faerdig. Desvaerre er jeg helt groen ud i fork/threads, saa
> alle former for hjaelp/links osv. vil vaere kaerkommen.

Klampeløsningen er at starte n processer. Vente til alle er færdige og
starte n til.

En bedre løsning er at lave 1 problemserver og n løsningsklienter.

I powerløsningen skal problemserveren også modtage løsninger og klienterne
kan stå tilfældige steder på Internettet (f.eks. localhost). Jeg antager,
at løse et enkelt problem tager et stykke tid ( >0.1 sek), så opsætning af
TCP-forbindelse ikke giver væsentligt overhead.

Jeg har lavet en simpel server og klient (skamløst planket fra  man
perlipc).

Din opgave er nu at udfylde:

Server:
  sub next_problem  # stik mig det næste uløste problem
  sub save_solution # gem den løsning jeg kommer med

Klient:
  sub solve_problem # løs et givent problem

Der er nogle begrænsninger ved det simple eksempel: 
- Problemet skal være udformet som en scalar, der ikke må indeholde \n.
- I svaret bør det indgå, hvilket problem man svarer på.


/Ole
-- 
Du må ikke spamme.
   -- Frit efter Markedsføringsloven §6a
      http://www.fs.dk/jura/loveregl/mfl/l_mfl.htm


SERVER
#!/usr/bin/perl -w
        use IO::Socket;
        use Net::hostent;              # for OO version of gethostbyaddr

        $PORT = 9000;                  # pick something not in use

        $server = IO::Socket::INET->new( Proto     => 'tcp',
                                         LocalPort => $PORT,
                                         Listen    => SOMAXCONN,
                                         Reuse     => 1);

        die "can't setup server" unless $server;
        print "[Server $0 accepting clients]\n";

        while ($client = $server->accept()) {
          $client->autoflush(1);
	  $solution=<$client>; #læs sidste løsning 
	  save_solution($solution);
	  $problem=next_problem();
	  print $client $problem,"\n";
	  print "Problem givet: $problem\n";
          close $client;
        }

sub next_problem {
    # figure out next problem
    ++$problem;
    return $problem;
}

sub save_solution {
    my $sol = shift;
    # save $sol to a file
    if($sol == 0) {
	# første solution -> skip
    } else {
	print "Løsning modtaget: $sol\n";
    }
}


KLIENT
#!/usr/bin/perl -w

$solution=0;

do {
    $new_problem=save_and_get_next_problem($solution);
    $solution=solve_problem($new_problem);
} until(1 == 2); # Forever

sub save_and_get_next_problem {
    my $solution=shift;
    my $next_problem;

    use IO::Socket;
    
    $remote = IO::Socket::INET->new(
				    Proto    => "tcp",
				    PeerAddr => "localhost",
				    PeerPort => "9000",
				    )
	or die "cannot connect to port 9000 at localhost";
    $remote->autoflush(1);
    print $remote $solution,"\n";
    print "Sendt $solution\n";
    $next_problem=<$remote>;
    print "Modtaget $next_problem\n";
    close $remote;

    return $next_problem;
}

sub solve_problem {
    my $problem = shift;
    my $solution;

    $solution=$problem +1;

    return $solution;
}




 
Forside   Tilmelding   Postarkiv   Oversigt   Kalender   Søg

 
 
Henvendelse vedrørende websiderne til <www_admin>. Senest ændret 2005-08-10, klokken 19:52
Denne side vedligeholdes af MHonArc .