Home » Tutorials » Object Pascal/RTL » Parallelisierung mit Delphis Parallel Library

Parallelisierung mit Delphis Parallel Library

Futures

Futures sind ein Konzept, das man in Java schon seit einigen Jahren kennt. In Delphi ist das nun auch verfügbar. Bei Futures handelt es sich um Code, der asynchron ausgeführt wird. Irgendwann später wird das Ergebnis der asynchronen Berechnung im Hauptthread benötigt. An dieser Stelle wird das Future nach dem Ergebnis befragt. Liegt es bereits vor, kann es sofort verwendet werden. Wenn nicht, wartet der Hauptthread an dieser Stelle, bis der asynchrone Task fertig ist.

Im Code funktioniert das relativ ähnlich zu den Tasks, die wir im letzten Kapitel gesehen haben. Allerdings erhält man beim erzeugen eines Futures eine Variable vom Typ IFuture, über deren Property Value man auf das Ergebnis der Berechnung zurückgreifen kann. IFuture ist generisch, d.h. man gibt in spitzen Klammern den Rückgabetyp an. Die anonyme Methode, die dem Future als Parameter übergeben wird, ist keine Prozedur, sondern eine Funktion. Entsprechend muss natürlich auch ein Rückgabewert gesetzt werden.

Beispiel:

var MyFuture: IFuture<Integer>;
  Total: Integer;
Begin
  MyFuture := TTask.Future<Integer>(function: Integer
  begin
      result := ...;
  end);
  Total := MyFuture.Value;

Über die Property Status kann der Berechnungsstatus abgefragte werden. Der Rückgabewert hat den Typ TTaskStatus. Die wichtigsten Status-Werte:

  • Created (direkt nach Erzeugung des Tasks)
  • WaitingToRun (warten, bis alles bereit zum Loslaufen ist, insbesondere, wenn ein einerer Prozess vorher beendet sein muss)
  • Running (Task läuft)
  • Completed (Task ist fertig)

Bei der Verwendung eines Futures muss der Status jedoch nicht abgefragt werden. Wie bereits oben erwähnt, wird der Rückgabewert verwendet, wenn er bereits vorliegt. Ansonsten wartet der Hauptthread automatisch darauf.

Download Beispiel-Anwendung (Futures, ZIP, 57 KB)

Ein Gedanke zu „Parallelisierung mit Delphis Parallel Library“

  1. In der Routine

      ...
      TParallel.For(1, 100000, procedure(I: Integer)
      Begin
        If IsPrime(i) Then
          inc(Total);
      End);
      ...

    würde ich statt inc(Total) die Anweisung TInterlocked.Increment(Total) verwenden, sonst stimmt die Anzahl der ermittelten Primzahlen nicht.

Kommentare sind geschlossen.