Avatar billede utah2000 Nybegynder
03. september 2001 - 14:23 Der er 7 kommentarer og
1 løsning

fork

Jeg har en løkke:

for {

Her vil jeg gerne lave noget med fork(), der kalder en subrutine for hver gennemløb. Subrutinen er lidt tid om at køre så jeg vil gerne have at der startes en ny \'tråd\' for hver gennemløb at løkken. Da min perl er bygget med itreads kan jeg ikke bruge treadpool eller alm tråde.



}
Avatar billede Lasse Novice
03. september 2001 - 19:00 #1
hvad er det lige præcis du spørger om. fork syntaksen?
Avatar billede utah2000 Nybegynder
10. september 2001 - 09:51 #2
Jeg mangle et eks. om hvordan man bruger fork i en løkke, de eks der er i bla doc, hjælper mig ikke det store.
Avatar billede Lasse Novice
10. september 2001 - 16:16 #3
FORK:
if($pid = fork()) {
  #parent do something
} elsif(defined $pid) { #$pid is zero here if defined
  #child do something
} else {
  #error in forking... usually do something like this:
sleep 2;
redo FORK;
}

Dette er det normale eksempel... Sætter du dette ind i en for-løkke skulle det virke efter hensigten. Jeg kender desværre ikke ti ithreads og ved derfor ikke om det er dette du søger...
Avatar billede utah2000 Nybegynder
11. september 2001 - 11:57 #4
for($x=0;$x<=6;$x++) {
           
FORK:
if($pid = fork()) {
  #parent do something
  print \"parent\";
} elsif(defined $pid) { #$pid is zero here if defined
  #child do something
  print \"child\";

} else {
  #error in forking... usually do something like this:
sleep 2;
redo FORK;
}


}

Når jeg gør dette printer den parent og child ud mange gange pr gennemløb?

Når jeg
Avatar billede Lasse Novice
11. september 2001 - 17:06 #5
ok... når man laver forks inde i hinanden skal man være forsigtig... Først og fremmest, skal man have en

exit; # i barnedelen
således at barnet ikke også eksekverer videre ned i scriptet(det samme som forældren eksekverer) ;-)

For det andet.... har de børn der fremkommer af en fork, også en fork kommando indeni sig, skal man huske som forældre at vente(wait) på zombierne(de bliver de kaldt), der fremkommer når børnene dør. Gør man ikke dette, vil man i dit eksempel se en vilkårlig rækkefølge på de outputs der kommer. MEN.... Vil man dog gerne have at barnet skal blive en deamon process, skal dette ikke gøres. (ikke dit tilfælde - tror jeg ikke)

Man skal også huske at utømte buffere forbliver utømte i BEGGE processor, så det er med god grund at man skal tømme disse INDEN man forker, således at der ikke kommer duplikater. Dette er isært vigtigt indenfor CGI verdenen!!!!! (ved ikke om det er her du skal bruge det)

Mht. hvorfor programmet virker som det skal:

Glem forløkken... jeg må have sovet...

Lav det hele som en funktion, og indeni child delen, kald funktionen igen, HVIS der er noget bestemt som er opfyldt:
my $counter=0;

sub hej {
if($pid = fork()) {
  print \'parent\' unless($counter);
  wait;
} elsif(defined $pid) {
  print \"child$counter\";
  hej() unless($counter++==4);
  exit;
} else {
  print \'ups\';
}
}

hej();
Avatar billede utah2000 Nybegynder
17. september 2001 - 10:31 #6
Det ser f..... ud til at det virker HURRA ... Du får lige lidt flere point:155 

Mange Tak...
Avatar billede utah2000 Nybegynder
17. september 2001 - 11:43 #7
sub hej {
    if($pid = fork()) {
          print \"parent\\n\" unless($counter);
          wait;
    }
    elsif(defined $pid) {
          print \"child:$counter\\n\";
          #lav noget *
          hej() unless($counter++==4);
          exit;
    }
    else {
          print \'ups\';
    }
}

* hvis nu den skal lave noget der tager lidt tid går \'løkken\' først vidre nå det er færdigt. Er der ikke en måde at få vidre.
Avatar billede utah2000 Nybegynder
17. september 2001 - 13:13 #8
gooky>

Det kan godt være at det ikke er fork, jeg skal bruge. Mit problem er som følger.

Jeg skal have en slags løkke, som for hver gennemløb kører en funktion jeg har lavet. Denne funktion tager lidt tid at udføre(ca 30 sek), derfor kunne det være fedt hvis løkken kunne loope vidre umidbart efter kaldet uden at vente på funktionen.
Derfor tænkte jeg at det kunne man lave med tråde, men min version at perl understøtter kun ithreads. Derfor ville jeg bruge fork.

I det ellers gode eks du lavede, ser det ud som at \'løkken\' venter på min funktion i stedet for at køre den i en tråd for sig selv.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester