Avatar billede webmover Nybegynder
21. februar 2011 - 22:24 Der er 16 kommentarer og
1 løsning

Multi-Threading hvordan?

Hej Eksperter,

Jeg sidder og arbejder på en webcrawler til en søge funktion der skal virke på kryds ad domæner.
jeg har lavet selve den funktion der crawler en side og finder alle interne links (dem der matcher links på de angivet domæner) på en given side.

Men det jeg ikke lige kan finde ud af er hvordan jeg skal crawle de sider jeg finder på den pågældende side?

I øjeblikket kommer jeg alle nye url'er ind i en mssql database. Men hvordan søger jeg for at den køre alle fundet url'er igennem.

Jeg ville i den forbindelse gerne bruge Multi-Threading til at køre crawlingen, men jeg har dog kun snuset lidt til Multi-Threading. Så er der nogle der kan hjælpe?
Avatar billede arne_v Ekspert
21. februar 2011 - 22:27 #1
Mit forslag:

* lav en queue af links
* put start URL i queue ved opstart
* have N threads som
  - tager en URL fra queue
  - henter den
  - parser den
  - putter links i queue
Avatar billede arne_v Ekspert
21. februar 2011 - 22:28 #2
Ja - og så er det nok en god ide at checke på om en URL allerede er hentet inden den kommer i queue.
Avatar billede johny Nybegynder
21. februar 2011 - 23:59 #3
Det bliver nok et performance spørgsmål, men umiddelbart ville jeg benytte mig af .NET 4.0 features med Paralelle library, hvor du har linq understøttelse til alt det, så du mere eller mindre helt slipper for at tænke i multithreading, det sørger .NET for i stedet.
Avatar billede Syska Mester
22. februar 2011 - 00:07 #4
Tror hans net forbindelse dør, før hans CPU lider af overbelastning.
( selvf altså efter hvad han skal med det der bliver hentet )

Men hvis han løbende tilføjer nye ting til listen, så er linq vel ikke helt den optimale løsning ... mht til eventuelt timeout og andre ting ... ellers kan PL også finde ud af det ?

mvh
Avatar billede johny Nybegynder
22. februar 2011 - 00:07 #5
Hov, var lidt en ufuldstændig sætning jeg fik skrevet. Det med performance, var i forhold til hvor ofte man skulle tjekke op på om man havde gennemløbet et site eller ej, men ja, umiddelbart skal alle resultater tilføjes til en fælles ressourcer der låses på, så der kan tjekkes op på denne om noget allerede er besøgt f.eks.
Avatar billede arne_v Ekspert
22. februar 2011 - 00:20 #6
PLINQ er vist ikke så relevant her.

Basale Thread's eller traditionel ThreadPool eller PFX Task er alle muligheder.
Avatar billede johny Nybegynder
22. februar 2011 - 08:09 #7
Hmm, med mindre jeg har misforstået noget, ville det så netop ikke være en fordel med PLINQ, hvis han lavede en klasse der implementerede IEnumerable<string> (hvor string er en url), som havde et dictionary og en stack i maven, hvor der så når en hjemmeside blev besøgt, blev "Try-Added" til dictionary'et, og hvis det lykkedes at adde til denne, tilføjede den internt også til stack'en? Så noget i stil med:

var myUrlEnumerator = new MyUrlEnumerator(initialUrls);

myUrlEnumerator.AsParallel().ForAll(url => {
  myUrlEnumerator.AddRange(GetAllLinksOnWebsite(url));
});

Jeg ved ikke om det gav mening lige umiddelbart, men denne metode ville da virke forholdsvis effektivt, uden at skulle tænke alt for meget i trådning?
Avatar billede arne_v Ekspert
23. februar 2011 - 02:51 #8
Jeg tror ikke at det er godt for PLINQ hvis action modificerer listen!
Avatar billede johny Nybegynder
23. februar 2011 - 08:24 #9
Er der nu som sådan ikke noget i vejen med. Har bare ikke kunnet komme på en løsning hvor låsning ikke tager for meget af performance til at det kan betale sig.
Avatar billede Syska Mester
23. februar 2011 - 12:38 #10
Tror ikke jeg ville bekymre mig om låsning, ellers må følgende namespace jo være skrevet til dette formål:
System.Collections.Concurrent

Der er allerde nok delay på at hente alle hjemmesiderne.

Men hvor blev #webmover af ... han kan han bedre forklare hvad han vil have :-)

mvh
Avatar billede webmover Nybegynder
23. februar 2011 - 13:14 #11
I har helt tabt mig!

Det jeg skal bruge er :

1. jeg har en funktion som hedder Scrawl som via HtmlAgilityPack's
HtmlDocument doc = hw.Load(@url); henter en side og finder alle links på siden og putter deres url'er ind i en database tabel, der efter laver den en søgning i den loaded sides body tekst efter et givent søge term og hvis søge termet er på siden kommes den ind i en anden database tabel. og tilsidst går den ind i den tabel med url'er og checker den url af som den lige har gennemløbet.

Det der er mit problem er hvordan jeg har få det sat op så når Scrawl funktionen er færdig så bliver den kørt igen men hvor den url den får er den første url i database tabelen der endnu ikke er blevet checket som gennemgået.

Der er den del med at genkalde Scrawl funktionen og give den en ny url der er mit problem, samt at jeg gerne ville have at den kunne køre Scrawl funktionen på flere url'er på samme tid.

Men jeg kan ikke gennemskue hvordan det skal hænge sammen for hvis jeg bare kalder den fulde url liste ud fra databasen vil den jo ikke indholde de nye url'er Scrawl finder under vejs?
Avatar billede webmover Nybegynder
23. februar 2011 - 13:16 #12
hvis I kunne komme ned et kode eks. på hvordan det kan gøres ville det være super! og som sagt jeg er helt ny når det kommer til Multi-Threading!!
Avatar billede johny Nybegynder
23. februar 2011 - 13:21 #13
Har du nogen tracking i databasen af hvilke sider der er besøgt?
Avatar billede webmover Nybegynder
23. februar 2011 - 13:35 #14
ja hver gang en side er blevet gennem gået bliver feltet "crawled" for den givende url sat til "true" for at sikre at den ikke crawler de samme sider, og når nye url'er bliver sat ind i databasen så bliver der også tjekket for om de er der i forvejen, før de bliver tilføjer. Så den samme url ikke er på listen flere gange.
Avatar billede webmover Nybegynder
23. februar 2011 - 13:36 #15
og der vliver også sat et dato stamp på hvor når en give url sidst er blevet crawlet.
Avatar billede webmover Nybegynder
24. maj 2011 - 11:19 #16
Smid et svar så lukker jeg spg! har desværre ikke fundet løsningen!
Avatar billede webmover Nybegynder
27. maj 2011 - 08:22 #17
lukker!
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