|
|||||||||||||||||||||||||||
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;
}
|
||||||||||||||
|
||||||||||||||