2017-02-01 10 views
1

В C#, вы можете ограничить количество потоков, например:ли Delphi Parallel.For имеют MaxParallism

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

ли Delphi иметь это в последнем компилятором, например, Берлин. Или у этой всеведущей есть это?

ответ

3

Используйте Parallel.For overload, который принимает TThreadPool и снабжает пул потоков, ограничивающий количество потоков. Это делается с помощью метода SetMaxWorkerThreads.

Обратите внимание, что я получил эту информацию, прочитав documentation.

1

Или у omnithreadlibrary есть это?

У него тоже есть.

Если вы начнете с конструктора Parallel.For, тогда вы получите IOmniParallelSimpleLoop Интерфейс, который имеет метод .NumTasks, по умолчанию для подсчета процессорных ядер. Он может быть отрегулирован, если вы отсоедините цикл от текущего потока выполнения, используя вызов .NoWait.

Если вы начинаете с генератора Parallel.ForEach, вы получаете интерфейс IOmniParallelLoop, а также NumTasks.

смотрите главы 2.12.4 и 2.11.1 на http://otl.17slon.com/book/chap04.html#highlevel-for

Также см http://www.thedelphigeek.com/2011/01/parallel-for-implementation-1-overview.html для общей идеи синтаксиса предполагаемого вызова.

Это должно быть что-то вроде

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

этот вопрос больше подразумевается, что вы думаете. первый Tparallel предназначен для работы только по конкретному случаю. для Exemple

это хорошо делать с tparallel

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

это должно быть избежать:

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

почему? и вот где я отвечаю на ваш вопрос: это потому, что Tparallel создает количество потоков, которые соответствуют количеству процессора (виртуального или физического), доступного в системе. поэтому, если у вас 32 процессора, тогда он создаст максимум 32 потока, если у вас всего один процессор, тогда он создаст только один поток. это также глобально для всего приложения, если у вас есть 2 потока, каждый из которых делает Tparalell, у вас не будет более одного потока процессором

, поэтому идея, представляющая собой Tparallel, заключается в том, что вам не нужно беспокоиться о количестве потока, система выбирает наиболее оптимальное для вас количество.но, как вы видите в моем примере, если ваш tparallel не является интенсивным процессором, вам, вероятно, понадобится больше потоков, чем количество доступных процессоров, и в этом случае я сильно стараюсь избежать tparallel и вместо этого использовать TanonymousThread

вы можете переопределить это число, выполнив SetMaxWorkerThreads (по умолчанию это число процессоров), но если вам нужно это сделать, им очень повезло, что вы должны вообще избегать использования Tparallel и использовать вместо этого TanonymousThread