03. september 2001 - 14:23Der 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.
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...
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?
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;
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.
Synes godt om
Ny brugerNybegynder
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.