Toon posts:

Hoe meerdere taken tegelijk uitvoeren?

Pagina: 1
Acties:

Onderwerpen


  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 21-06-2021
Ik heb een webpagina met ongeveer 30 links. Al deze links wil ik openen en delen van de pagina opslaan in een database (html scrapen). Elke link een-voor-een openen gaat prima, maar ik wil kijken of ik meerdere links op de pagina tegelijk kan openen en de HTML kan scrapen. Ik maak gebruik van Ruby on Rails.

Op dit moment kan de applicatie wel meerdere processen tegelijk starten die elk van een webpagina de links 1-voor-1 scrapen.

Ik zat te denken aan twee mogelijke opties om het proces te versnellen:
1. 1 proces die alle links opslaat in de database en meerdere processen die de links uit de database haalt, opent en de HTML scraped. Deze architectuur maakt het allemaal wel wat ingewikkelder dan het nu is en ben ik niet echt een voorstander van.
2. Op de webpagina splitsen we het proces in meerdere child-processen (forken) en laten we elk child-proces een aantal links afhandelen (scrapen). Dit klinkt wat makkelijker te implementeren, maar de werkelijkheid is anders. Elk proces wil in feite zijn eigen database-connectie hebben. Dit resulteert erin dat het eerste child-proces dat klaar is ook meteen de database-connectie sluit. Hoewel het in eerste instantie wat makkelijker lijkt te implementeren dan optie 1, is het in werkelijkheid technisch veel lastiger dan optie 1. Bovendien is het een behoorlijk dure operatie, elk childproces maakt een kopie van het parentproces in het geheugen. Dit maakt het een behoorlijke dure operatie. Stel dat ik 4 childprocessen gebruik om te scrapen, dan gebruiken ze dus ook 4x zoveel geheugen.

Optie 2 is kortom technisch erg ingewikkeld en heel duur qua resources. Optie 1 is wellicht interessant om te implementeren, maar kan ik beter implementeren als de rest van de applicatie helemaal af is.

Heeft er iemand nog een goed idee hoe ik deze applicatie op een slimme manier nog kan versnellen?

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 22:53

leuk_he

1. Controleer de kabel!

Het probleem heb je goed bedacht, en het antwoord is threading, in combinatie met een worker queue.

http://www.rubyrobot.org/...b-queue-for-ruby-on-rails

Ja, je programma wordt wel meteen een stuk commplexer. Wellicht is het nuttig om enkel het gedeelte wat blokkeerd (het ophalen van de html van de remote server) te multithreaden, en de data die het maakt weer in de hoofdqueue te parsen en op te slaan.

Lees je ook eerst in in threading, (niet noodzakelijk ruby threading), want locking en thread synchonisatie moet je wel eerst beseffen. dit is de eerste link die ik vind (C#) met de belangrijkste technieken. http://www.albahari.com/threading/

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
leuk_he schreef op dinsdag 14 juni 2011 @ 10:23:
in combinatie met een worker queue.
Daarvoor kun je zoeken op het "Producer-Consumer" pattern.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Tp21
  • Registratie: December 2003
  • Laatst online: 03-06-2021
Wat je zou kunnen doen is een worker queue gebruiken (bijvoorbeeld resque). en vervolgens een x aantal workers maken die het zware werk doen. als er dan links geparsed moeten worden, kan je deze gewoon in de queue zetten.


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee