AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Asynchron Jobs abarbeiten - Best Practice?

Asynchron Jobs abarbeiten - Best Practice?

Ein Thema von chaosben · begonnen am 14. Mai 2010 · letzter Beitrag vom 14. Mai 2010
Antwort Antwort
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#1

Asynchron Jobs abarbeiten - Best Practice?

  Alt 14. Mai 2010, 10:07
Moin!

Bitte helft mir mal auf die Sprünge: Wie macht man folgendes am richtigsten?

Das grundsätzliche Vorgehen ist dieses:

Der Hauptthread des Dienstes ermittelt die abzuarbeitenden Jobs. Die schreibt er in die Job-Liste der einzelnen Job-Threads.
Die Job-Threads erledigen die Jobs und schreiben sie dann in die JobsDone-Liste des Hauptthreads zurück.
Dann löscht der Hauptthread die Jobs, die in der JobsDone-Liste stehen.

Die Frage ist: Auf welche Weise schreibt man am besten (damit man die höchste Geschwindigkeit erzielt) in die Listen der Threads(Haupt->Job und Job->Haupt)?
Jeden Job einzeln oder mehrere Jobs in einem Rutsch?


Der Hintergrund der Frage ist: Beim Schreiben muss man die Liste ja sperren, bzw. irgendeiner andere Methode (CriticalSection, ...) nutzen um Konflikte zu vermeiden. In der Zeit werden die anderen Threads ja blockiert. Was ist also der beste Weg möglichst wenig Wartezeit zu haben?
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.804 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Asynchron Jobs abarbeiten - Best Practice?

  Alt 14. Mai 2010, 10:10
Schau doch mal, wie Andreas das gelöst hat
http://andy.jgknet.de/blog/?page_id=100
Markus Kinzler
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
178 Beiträge
 
Delphi 10 Seattle Professional
 
#3

Re: Asynchron Jobs abarbeiten - Best Practice?

  Alt 14. Mai 2010, 10:29
Du solltest auch noch unbedingt einen Blick auf OmniThreadLibrary werfen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.739 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Asynchron Jobs abarbeiten - Best Practice?

  Alt 14. Mai 2010, 11:39
Ich hab das bei meinen Programmen inzwischen oftmals so gelöst.
( über diese Klasse > http://www.delphipraxis.net/internal...096957#1096957 )

> der Hauptthread füllt eine Liste, mit den zu bearbeitenden Aufgaben
> alle Threads fragen nun in dieser Liste ab, ob es was gibt,
also der Thread, welcher grade nix zu tun hat, der nimmt sich die älteste Aufgabe raus und bearbeitet siese

Wenn man für jeden Thread eine eigene Liste verwaltet, dann müsste der Hauptthread schon genau wissen, wie lange die Aufgaben dauern und verteilt so die Aufgaben ... hier kann es aber auch mal vorkommen, daß einige Threads nichts zu tun haben, wärend andere Threads sich zu Tode rackern, weik die Aufgaben nicht "gut" verteilt wurden.

Die Liste hatte ich direkt schon mit einer Threadabsicherung ausgestatet, damit dieses beim Zugriff nicht noch zusätzlich in den Threads behandelt werden muß (wo man es schnell mal vergessen könnte).

PS: Willlst du jetzt noch eine Rückmeldung, für die erledigten Aufgaben, dann könnte man (wie du es wohl vor hast) die erledigten Aufgaben von den Threads in eine weitere Liste eintragen lassen, welche dann vom Haupthtread ausgelesen wird (praktisch alles nur andersrum) oder du schickst deinem Hauptprogramm einfach via PostMessage, SendMessage oder auch über einen synchronisierten Prozeduraufruf eine Meldung "Diese Aufgabe ist jetzt fertig" (wobei die Varianten, mit der 2. Liste, bzw. über PostMessage, aus Sicht der Arbeitssthreads vermutlich das Schnellere wären).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Asynchron Jobs abarbeiten - Best Practice?

  Alt 14. Mai 2010, 11:44
Danke himi für das ausführliche drüber nachdenken.

Ich habe dummerweise verschwiegen, das die Jobs zu genau einem Thread gehören. (Der Job-Thread hat einen DB-Verbindung und der Job ist für genau diese DB bestimmt).

Was mir aber immer noch nicht klar ist: Was ist besser: Eine gemeinsame Liste nur kurz aber oft zu sperren oder länger und seltener zu sperren.

Btw.: Das Prinzip wie ich es oben beschrieben habe, läuft im Moment schon ... es funktioniert. Die Frage hat eher einen Tuning-Hintergrund ... so nach dem Motto: Kann ich das Ganze noch schneller machen?
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.739 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Asynchron Jobs abarbeiten - Best Practice?

  Alt 14. Mai 2010, 12:14
Zitat von chaosben:
Was mir aber immer noch nicht klar ist: Was ist besser: Eine gemeinsame Liste nur kurz aber oft zu sperren oder länger und seltener zu sperren.
Die Pausen zwischen den Sperrungen sollten auf jedenfall länger sein, als die Sperrung selber andauert.
Sonst passiert schnell mal sowas, wie in diesem Thread http://www.delphipraxis.net/internal...t.php?t=172942 , wo alles hängen bleibt.

Also es kommt darauf an, wie schnell der Thread arbeitet und wie lange er auch mal auf eine neue Aufgabe warten kann.
- Wenn der Thread zeit hat, dann kann länger+seltener sperren nicht schädlich sein.
- Wenn der Thread aber sehr schnell neue Aufgaben beginnem muß, dann eben lieber kürzer+öfters.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.804 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Asynchron Jobs abarbeiten - Best Practice?

  Alt 14. Mai 2010, 12:16
Du könntest aber auch die Verwaltung der Liste von einem Thread durchführen lassen
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Asynchron Jobs abarbeiten - Best Practice?

  Alt 14. Mai 2010, 21:10
Ok ... vielen Dank.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
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 13:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf