Avatar billede laped Nybegynder
13. december 2008 - 22:13 Der er 7 kommentarer og
2 løsninger

Web crawler + multi threading

Hey,

Jeg er i gang med en web crawler, som skal kunne "støvsuge" et website for html og billeder.

Programmet skal selvfølgelig have et "indgangslink", som skal gennemsøges for links (med regex) og links skal muligvis tilføjes til en slags pulje. Herefter skal der startes X antal tråde (det kunne være 10 f.eks.), som går i gang med at arbejde sig igennem de links der nu måtte være i puljen og i det trådende selv finder links, skal de også tilføjes til puljen osv. - eller det er i hvert fald mine tanker omkring det, indtil videre.

Jeg leder egentlig efter lidt tips/tricks til hvordan det med flere tråde, kunne implementeres i praksis.
Avatar billede kalp Novice
13. december 2008 - 22:41 #1
benyt dig af en ThreadPool.
det virker som fin nok til det du ønsker.

Google den og se hvad det er:)
Avatar billede arne_v Ekspert
14. december 2008 - 00:02 #2
Du smider URL's i en queue. Husk at synkronisere adgang til queue. Dine threads
kører i en løkke hvor de henter fra queue, henter URL, processer den, smider nye
URL's i queue og smider den processede URL i et HashSet over URL's som ikke skal
processes igen.

Man kan selv starte et antal tråde eller man kan bruge ThreadPool - det kritiske
er synkroniseringen af adgangen til fata strukturer som bruges af flere tråde og
begrænsninger på hvilke URL's der skal processes (de skal ikke processes
hvsi de allerede er det og de skal formentlig heller ikke processes hvis
de peger på en anden site).
Avatar billede laped Nybegynder
14. december 2008 - 01:39 #3
Jeg kunne godt tænke mig at præsentere working threads grafisk, i et listview f.eks., med info omkring hvilken url der bliver arbejdet på - det kan jeg vel ikke umiddelbart gøre, hvis jeg benytter threadpool?

Hvis jeg manuelt vil starte 10 tråde og lade dem køre i en løkke, for at tjekke efter url's i min såkaldte url-queue, hvordan bør det klares i praksis (simpelt eksempel ønskes)? Noget med et for-løkke, som lopper 10 gange, starter en thread med en, lad os kalde den ThreadProc-metode, som indeholder noget i stil med:
while (true) {
  // tjek om der er url's i min url-queue, hent url og processer
}

Tror jeg? :-)

Mht. synkroniseringen af adgangen til min data - lad os sige jeg har den der queue med url's som skal processeres og en queue med url's som er blevet processeret. Der kan jeg vel godt komme i en situation hvor en url bliver processeret 2 gange - f.eks. ved at Thread1 henter url fra første queue og processerer den, men i mellemtiden har en anden thread puttet selvsamme url i url-queue og den bliver så hentet ud til processering, inden den første thread når at registrere url'en som færdig?
Avatar billede kalp Novice
14. december 2008 - 01:53 #4
Du kan godt benytte en ThreadPool.
f.eks er det vel blot dette du ønsker.

public Program() {
            WaitCallback thread = new WaitCallback(CrawlUrl);
            ThreadPool.QueueUserWorkItem(thread, "http://www.google.dk"));
        }
        public void CrawlUrl(object _url) {
            string url = _url as string;
            //Skriv til dit listview, skal laves korrekt så det er main tråden der opdatere den.
            //din crawler logik her
            //fjern fra listview
        }
Avatar billede kalp Novice
14. december 2008 - 01:55 #5
med hensyn til din kø så kan du måske benytte en "lock" mekanisme på den og hvis ikke kan du bruge Monitor.Enter - Monitor.Exit
Avatar billede arne_v Ekspert
14. december 2008 - 02:53 #6
Noget a la:

            bool done = false;
            do
            {
                CrawlTask ct = null;
                lock(q)
                {
                    if(q.Count > 0) {
                        ct = q.Dequeue();
                    }
                }
                if(ct != null)
                {
                    // process ct
                }
                else
                {
                    done = true;
                }
            }
            while(!done);
Avatar billede laped Nybegynder
15. december 2008 - 20:13 #7
tak for det, nu har jeg fået lavet "the basics" og det virker bare - smid i endeligt et svar
Avatar billede kalp Novice
15. december 2008 - 21:04 #8
=)
Avatar billede arne_v Ekspert
15. december 2008 - 21:11 #9
.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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