在C#中,您可以限制线程数,如下所示:
MyPOJO pojo = new MyPOJO();
pojo.fooType = Foo.class;
ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString(pojo);
Delphi是否在最新的编译器中具有此功能,例如柏林。或者omnithreadlibrary有这个吗?
答案 0 :(得分:3)
使用接受Parallel.For
overload的TThreadPool
,并提供限制线程数的线程池。这是通过SetMaxWorkerThreads
方法完成的。
请注意,我通过阅读documentation获取了此信息。
答案 1 :(得分:1)
或者omnithreadlibrary有这个吗?
确实也有。
如果您从Parallel.For
构造函数开始,那么您将获得具有IOmniParallelSimpleLoop
方法的.NumTasks
接口,默认为CPU核心数。如果使用.NoWait
调用从当前执行线程中分离循环,则可能会进行调整。
无论您是从Parallel.ForEach
生成器开始,都可以获得IOmniParallelLoop
接口,并且它也有NumTasks
。
见http://otl.17slon.com/book/chap04.html#highlevel-for
的第2.12.4和2.11.1章节另请参阅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
);
答案 2 :(得分:0)
这个问题有你想的更多含义。第一个Tparallel设计仅适用于特定情况。例如
这与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个线程,如果您只有1个处理器,那么它将只创建一个线程。对于所有应用程序来说这也是全局的,如果你有2个线程,每个都做Tparalell,你将不会有多个处理器的线程
所以Tparallel的想法是你不需要担心线程的数量,系统会为你选择最优的数字。但正如你在我的示例中所看到的,如果你的tparallel不是处理器密集型的,那么你可能需要比可用处理器数量更多的线程,在这种情况下我强烈要求避免tparallel并使用替代TanonymousThread
您可以通过执行SetMaxWorkerThreads(默认情况下是处理器的数量)来覆盖此数字但是如果您需要这样做,那么您必须避免使用Tparallel并且需要使用TanonymousThread