Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateiliste effektiv downloaden (https://www.delphipraxis.net/111142-dateiliste-effektiv-downloaden.html)

xZise 30. Mär 2008 15:05


Dateiliste effektiv downloaden
 
Hallo DP,
ich habe eine Frage:
Und zwar programmiere ich einen Nachfolger von Quick Download (Qd).

Da man bei Qd meistens mehrere Dateien hat, möchte ich diese parallel downloaden.
Entweder lastet man seine Bandbreite besser aus, oder man entlastet die Server. (Je nach Downstream von einen selbst und den Upstream des Servers)

Wie macht man das nun am besten?
Zuerst habe ich gedacht: Machst du einfach mehere Threads (vom Benutzer einstellbar), welche alle auf die Liste zugreifen (threadsafe?) und diese durchgehen und überprüfen ob die Datei gedownloadet werden kann.
  • Vorteil:
    • Effektiv, da nur einmal Threads erstellt werden, diese nie suspenden müssen
    • Eine zentrale Stelle kann die Threads verwalten
    Nachteil:
    • Nicht umbedingt Threadsafe
    • Zwei Threadkritische Punkte: Zugriff auf die Liste und der Zugriff auf den Eintrag

Eine andere Möglichkeit wäre, dass jeder Eintrag selber seinen Thread verwaltet.
D.h. er wird zum startet des Downloads aufgefordert. Und er erstellt einen Thread füttert ihn mit den Werten und lässt ihn rennen.
Es gäbe dabei zwei verschiedene Möglichkeiten: Onrequest oder Oncreate. Bei wird der Thread erstellt, wenn der Thread benötigt wird, bei zweiterem existiert der Thread immer.
Ersteres freut den Ram, zweiteres freut den CPU.
  • Vorteil:
    • Von sich aus Threadsafe, da immer nur ein Thread pro Eintrag arbeitet
    Nachteil:
    • Benötigt mehr Ram (im Oncreate)
    • Möglicherweise längere "Arbeitszeiten", da die Threads erstellt werden müssen (im Onrequest)
    • Die Verwaltung stellt ein Problem da: Die Liste muss herausbekommen, wann ein neuer Thread gestartet werden kann

Nun wie würdet ihr das lösen?

MfG
xZise

PS: Zum ersteren habe ich schon eine Frage gestellt gehabt: [TCriticalSection] Teil einer Klasse auf die zugegriffen wird

MrKnogge 30. Mär 2008 15:37

Re: Dateiliste effektiv downloaden
 
Ich würde die zweite Variante nehmen, da die längere Arbeitszeit und der Ramverbrauch durch das Erstellen eines Threads ja nun wirklich nicht der Rede wert ist.

Aber warum entlasten parallele Downloads den Server ?

xZise 30. Mär 2008 15:56

Re: Dateiliste effektiv downloaden
 
Okay, also ich habe vergessen zu erwähnen: Solange die Downloads verschiedene Server betrifft ;)

Also wenn eine Datei von der einen Website stammt, und die andere von einer anderen Website, und beide sich nicht den Down-/Upstream teilen müssen kann ich meinen Bandbreite besser nutzen (ich habe 26 MBit/s), da die meißten Server zw. 300 kB/s und 1 MB/s anbieten. Oder für diejenigen, mit 6 Mb/s bringt es natürlich nicht so viel, hingegen wird dann nur weniger Upstream genutzt.
Wenn du Ubuntu benutzt (andere Distributionen kenne ich dahingehend nicht): Beim Update werden immer mehere Dateien gleichzeitig gedownloadet.

Ich tendiere auch eher zum zweiteren, aber wollte bzw. möchte weiterhin eure Meinung dazu wissen.

MfG
xZise

PS: Wenn du auch nur eine Datei gleichzeitig downloaden möchtest: Ich baue eine Option ein ;)

MrKnogge 30. Mär 2008 16:27

Re: Dateiliste effektiv downloaden
 
Eine Datei reicht bei meinen 384Kb/s wohl aus :mrgreen:

Nochmal zu obiger Sache, ich glaube einfach, dass es der Aufwand die Vergabe der Aufträge Threadsave zu machen es nicht Wert ist.

SirThornberry 30. Mär 2008 16:34

Re: Dateiliste effektiv downloaden
 
etwas threadsave machen ist ja nicht wirklich aufwand. Zugriff auf gemeinsame Objecte einfach in criticalSections packen und vcl-objecte müssen in einem Thread ja nicht wirklich sein da visuelle Sachen darin eigentlich nichts zu suchen haben.

xZise 30. Mär 2008 17:03

Re: Dateiliste effektiv downloaden
 
Zitat:

Zitat von SirThornberry
etwas threadsave machen ist ja nicht wirklich aufwand. Zugriff auf gemeinsame Objecte einfach in criticalSections packen und vcl-objecte müssen in einem Thread ja nicht wirklich sein da visuelle Sachen darin eigentlich nichts zu suchen haben.

Wie sieht das mit den auslesen von Daten aus?

Weil ein Thread würde folgendes machen:
Code:
Für i = 0 bis Liste.AnzahlEinträge - 1 mache
beginne
  wenn Liste.Eintrag[i].Status "sReady" ist dann
  beginne
    Setze "Liste.Eintrag[i].Status" auf "sDownloading"
    Starte den Download
  beende
beende
Wo müsste ich CriticalSections hinpacken?
Die Liste ist übrigens auch ein Objekt.

MfG
xZise

gore 3. Apr 2008 09:37

Re: Dateiliste effektiv downloaden
 
Nur wo Du was änderst, was andere Threads auch ändern könnten, mußt Du CriticalSections einsetzen. Siehe Lost updates.
Also reine Leseoperationen müssen nicht mit CriticalSections geschützt werden.

Delphi-Quellcode:
EnterCriticalSection(LockList);
try
  Setze "Liste.Eintrag[i].Status" auf "sDownloading"
finally
  LeaveCriticalSection(LockList);
end;
MfG Bernd


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz