2017-02-01 4 views
1

In C# können Sie die Anzahl der Threads begrenzen, wie folgt aus:Does Delphi Parallel.For haben eine MaxParallism

Parallel.For(0, 10, new ParallelOptions { MaxDegreeOfParallelism = 4 }, count => 
{ 
    Console.WriteLine(count); 
}); 

Does Delphi haben dies in neueste Compiler z.B. Berlin. Oder hat die Omnithread-Bibliothek das?

Antwort

1

Oder hat die omnithreadlibrary das?

Es hat es auch.

Wenn Sie mit Parallel.For Konstruktor beginnen würden, dann erhalten Sie IOmniParallelSimpleLoop Schnittstelle, die .NumTasks Methode hat, standardmäßig auf CPU-Kerne zählen. Es kann angepasst werden, wenn Sie die Schleife aus dem aktuellen Ausführungsthread mithilfe des Aufrufs .NoWait lösen.

Ob Sie mit Parallel.ForEach Generator starten, erhalten Sie die IOmniParallelLoop Schnittstelle und es hat auch NumTasks.

Siehe Kapitel 2.12.4 und 2.11.1 bei http://otl.17slon.com/book/chap04.html#highlevel-for

Auch http://www.thedelphigeek.com/2011/01/parallel-for-implementation-1-overview.html für die allgemeine Vorstellung von der beabsichtigten Aufrufsyntax sehen.

Es sollte diese Frage mehr Implikation etwas wie

Parallel.ForEach(0, 10 (* ,1 *)) 
    .NumTasks(4) 
    .Execute(
    procedure (const elem: integer) 
    begin 
     WriteLn(elem); 
    end 
); 
0

sein, dass Sie denken. Das erste Tparallel ist nur für den spezifischen Fall gedacht. für exemple

dies mit tparallel

TParallel.For(1, Max, procedure (I: Integer) 
    begin 
    Do_processor_intensive_work 
    end); 

dies gut zu tun müssen vermieden werden:

TParallel.For(1, Max, procedure (I: Integer) 
    begin 
    do_waiting_proc_like_downloading_url 
    end); 

warum? und hier beantworte ich Ihre Frage: weil Tparallel die Anzahl der Threads erstellt, die der Anzahl der Prozessoren (virtuell oder physisch) entsprechen, die auf dem System verfügbar sind. Wenn Sie also 32 Prozessoren haben, werden maximal 32 Threads erstellt. Wenn Sie nur einen Prozessor haben, wird nur ein Thread erstellt. Dies ist auch global für alle app, wenn Sie 2 thread, die tparalell tun, haben Sie nicht mehr als ein thread pro Prozessor

so die Idee behing Tparallel ist, dass Sie nicht über die Zahl kümmern müssen von Thread, wählt das System die optimale Anzahl für Sie.aber wie Sie in meinem Beispiel sehen, wenn Ihre Tparallel ist nicht prozessorintensiv, dann werden Sie wahrscheinlich mehr Thread als die Anzahl der verfügbaren Prozessor und in diesem Fall ich stark suggest zu vermeiden tparallel und stattdessen verwenden TanonymousThread

Sie überschreiben können diese Zahl, indem Sie SetMaxWorkerThreads (das ist standardmäßig die Nummer des Prozessors) tun, aber wenn Sie dies tun müssen, ist ihr Glück, dass Sie überhaupt Tparallel verwenden müssen und stattdessen TanonymousThread

verwenden müssen
Verwandte Themen