21. februar 2011 - 22:24Der 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?
* 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
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.
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 ?
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.
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);
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.
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?
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.
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.