AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

Ein Thema von karlkoch · begonnen am 26. Okt 2020 · letzter Beitrag vom 28. Okt 2020
Antwort Antwort
Seite 1 von 2  1 2   
karlkoch

Registriert seit: 26. Feb 2006
Ort: Leipzig
30 Beiträge
 
Delphi 10.4 Sydney
 
#1

Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 26. Okt 2020, 12:53
Hallo,

ich verarbeite Vorschaubilder eines Verzeichnisses mit vielen Bildern. Für jede Datei im Verzeichnis starte ich einen Task und lasse ihn von der Delphi Parallel Programming Library verarbeiten. Soweit nichts besonders.

Während der Nutzer durch die Liste der Bilder scrollt, möchte ich gern, dass die Tasks der aktuell sichtbaren Bilder priorisiert werden. Soll heißen, gibt es mit der PPL von Delphi die Möglichkeit, die Reihenfolge einmal gestarteter Tasks zu manipulieren, solange sie in der Queue auf einen Workerthread warten und noch nicht verarbeitet wurden?

Viele Grüße,

karlkoch
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 26. Okt 2020, 13:22
Man kann die Priorität von Prozessen und Threads verändern, evtl. auch schon bei ihrem Start festlegen.

Ansonsten läßt sich, soweit ich weiß, Windows aber grundsätzlich nicht in seine Entscheidungen, wann was behandelt bzw. abgearbeitet wird, hineinreden.
  Mit Zitat antworten Zitat
karlkoch

Registriert seit: 26. Feb 2006
Ort: Leipzig
30 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 26. Okt 2020, 13:27
Hallo,

es geht nicht um Thread- oder Prozessprioritäten, sondern um die Abarbeitungsreihenfolge der Delphi PPL (die nichts mit Windows zu tun hat).

Viele Grüße,

karlkoch
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 26. Okt 2020, 13:49
Du kannst einen Task/Future höchstens explizit in einem bestimmten TThreadPool stecken, und die können unterschiedliche Limits (Min & Max) für Worker-Threads haben. Allerdings ist auch nicht vorgesehen einen Task wieder aus einem Threadpool herauszunehmen und dann in einen anderen zu stecken.

Ich würde einfach zwei Listen anlegen (sichtbare und unsichtbare Einträge) und ein Task ist so gebaut dass er eine sichtbare Datei bearbeitet. Wenn keine da ist, eine unsichtbare.
  Mit Zitat antworten Zitat
karlkoch

Registriert seit: 26. Feb 2006
Ort: Leipzig
30 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 26. Okt 2020, 14:08
Ich würde einfach zwei Listen anlegen (sichtbare und unsichtbare Einträge) und ein Task ist so gebaut dass er eine sichtbare Datei bearbeitet. Wenn keine da ist, eine unsichtbare.
Ja, ich denke die Tasks dürfen erst den eigentlichen "Job" bekommen, wenn sie an der Reihe sind. Dann muss ich keine Tasks umsortieren, sondern brauch einfach nur meine interne Job-Liste anpassen.

Ein Problem sehe ich dabei noch. Wenn mehrere Bereiche einer Anwendung den gleichen ThreadPool verwenden, wie verhindere ich, dass ein Bereich mit einer Fülle an Tasks den Pool eine längere Zeit für sich beansprucht? Um das zu lösen, müsste ich das Konzept global einsetzen, d.h. alle Tasks aller Anwendungsbereiche dürfen erst bei der tatsächlichen Ausführung ihren Job bekommen. Gibt es von der PPL eine vorgefertigte Lösung, um so ein grundsätzliches Problem zu lösen?

Viele Grüße,

karlkoch
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#6

AW: Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 26. Okt 2020, 14:13
Joar, leibt wohl nur selbermachen.

* eine TThreadList bzw. TStack+ThreadLock mit den Bildern
* ein ThreadPool (mehrere Threads) die sich nacheinander dort ein Bild rausholen
* und dann in ThreadList die Bilder hochschieben, welche drade angezeigt werden sollen, damit sie aös nächstes dran kommen
* * wenn ganz schnell, eventuell manuell einen neuen Thread starten (oder den Pool kurz vergrößern) und notfalls einen anderen Thread pausieren (bzw. dessen ThreadPriorität runtersetzten oder die Priorität des neuen Threads erhöhen), damit es schneller geht


Zitat:
Ein Problem sehe ich dabei noch
Die Aufgaben priorisieren, damit das Wichtige zuerst kommt, egal von wo es kommt.
Oder mehrere Threadpools, wo du dann aber die Poolgrößen eventuell anpassen müsstest/könntest, jenachdem vieviele (arbeitende) Pools es gibt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (26. Okt 2020 um 14:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.123 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 26. Okt 2020, 14:55
Gibt es von der PPL eine vorgefertigte Lösung, um so ein grundsätzliches Problem zu lösen?
Ich würde bei dieser Problemstellung ganz auf die PPL verzichten. Da Du die Bilder - wenn ich es richtig verstanden habe - von der Platte liest,
würde ich sowieso nicht mehr als 8 Threads nehmen, ggf. sogar weniger.
In so einen Fall nehme ich 6 Worker Thread und 2 Prio-Threads. Oder (4/1).

Von da aus gibt es zwei Möglichkeiten. Entweder eine direkte Trennung 2 (Threadsafe)-Listen oder ggf. einen Thread-Listen-Thread die die Aufgaben verteilt und ggf.
die Liste umsortiert oder Aufgaben nach Priorität rauspickt und dann verteilt.

Mavarik
  Mit Zitat antworten Zitat
karlkoch

Registriert seit: 26. Feb 2006
Ort: Leipzig
30 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 26. Okt 2020, 16:21
Ok, bisher bin ich mit eigenen Entwicklungen gut gefahren, war jedoch der Hoffnung, meine Implementierungen schrittweise durch "native" Unterstützungen zu ersetzen. Schade, dann ist die PPL immer noch nicht für meine Zwecke geeignet.

Viele Grüße,

karlkoch
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.123 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 27. Okt 2020, 13:52
Ok, bisher bin ich mit eigenen Entwicklungen gut gefahren, war jedoch der Hoffnung, meine Implementierungen schrittweise durch "native" Unterstützungen zu ersetzen. Schade, dann ist die PPL immer noch nicht für meine Zwecke geeignet.
Wenn man als Werkzeug nur einen Hammer hat, sehen alle Ziele wie ein Nagel aus...

Sicherlich kann man viele Hintergrundverarbeitung mit der PPL lösen, aber wie immer bei Lösungen nach dem Motto "One fits all", gibt es in der Regel eine
spezielle Lösung für ein Problem, dass der Anforderung besser gerecht wird.

Die PPL ist sehr gut für "shot and forget" geeignet. Spätestens, wenn es sich nicht um "Schön-Wetter-Code" handelt und ggf. Fehlermeldung/Exceptions zu erwarten sind,
muss man sich auch mit der PPL schon Gedanken machen.

Also bei Hintergrundverarbeitungen z.b. in Apps für iOS & Android, bei denen möglichst alles was nicht auf die UI zugreift, im Hintergrund ausgeführt werden sollte, ist die
PPL sehr hilfreich bis zu - ohne geht es kaum.

Daher - immer das richtige Werkzeug für das zu lösende Problem verwenden!

Mavarik
  Mit Zitat antworten Zitat
karlkoch

Registriert seit: 26. Feb 2006
Ort: Leipzig
30 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Parallel Programming Library: Reihenfolge von Tasks (Priorisierung)

  Alt 27. Okt 2020, 23:28
Hallo,

an sich bin ich mit der PPL zufrieden, es fehlen nur Kleinigkeiten, um mein Vorhaben mit der Library umzusetzen.

Eigentlich ist das Problem gar nicht mehr die fehlende Priorisierung, sondern die Möglichkeit, die maximale Anzahl gleichzeitig abzuarbeitender Tasks zu beschränken. Meine Idee ist, durch einen eigenen "Scheduler" die vielen Tasks zunächst in einer eigener Queue zu sammeln und immer nur dann an die PPL zu übergeben (ITask.Start), wenn aktuell nicht mehr als X Tasks ausgeführt werden. Gerade bei Festplatten- oder Datenbankzugriffen darf es nicht zu viele gleichzeitige Tasks geben, wobei TThreadPool.SetMaximumWorkerThreads keine Abhilfe schafft, weil dieser Wert an die CPU-Kerne gebunden ist.

Leider scheitert mein Vorhaben aktuell daran, dass ich es nicht schaffe, auf saubere Art und Weise extern über die Fertigstellung eines Tasks informiert zu werden, damit ich die nächsten Tasks rausschicken kann (egal ob ein Task ausgeführt, abgebrochen oder durch einen Fehler beendet wurde). Interessant sieht für mich TTask.ProcessCompleteEvents aus, weil das immer am Ende eines Tasks aufgerufen wird, allerdings verhindert TTask eine Ableitung, sodass ich diese Methode überschreiben könnte.

Oder hat jemand einen anderen Ansatz für mich?

Viele Grüße,

karlkoch
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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