Hoe meerdere taken tegelijk uitvoeren?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
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?

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 11-07 14:23

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.


Acties:
  • 0 Henk 'm!

  • 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.”


Acties:
  • 0 Henk 'm!

  • Tp21
  • Registratie: December 2003
  • Laatst online: 01-07 17:22
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.