任务并行库时间分片
Task parallel library time slicing
我在 WCF
应用程序的几个地方使用了一个 TaskParallel
库。
在一个地方,我像这样使用它:
地点 1
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 100 };
Parallel.ForEach(objList, options, recurringOrder =>
{
Task.Factory.StartNew(() => ProcessSingleRequestForDebitOrder(recurringOrder));
//var th = new Thread(() => ProcessSingleRequestForDebitOrder(recurringOrder)) { Priority = ThreadPriority.Normal };
//th.Start();
//ProcessSingleRequestForDebitOrder( recurringOrder);
});
在另一种方法中,我用过它:
地点 2
System.Threading.Tasks.Task.Factory.StartNew(() => ProcessTransaction(objInput.Clone()));
问题是两个地方之间的时间片。也就是说,如果我调用了并行循环正在 Place 2 处理数百条记录的方法,我在 Place 1 的线程正在等待所有记录都已处理。可以告诉我如何对处理进行时间分割吗?
我正在使用来自 .net 3.5 的任务并行库;
问题是您在位置 1 中产生了很多任务,而位置 2 现在正在排队。位置 1 中的并行循环什么都不做,因为正文只启动一个很快完成的任务。
可能,您应该从位置 1 中删除 StartNew 事物,以便降低并行度。我不确定这是否会完全消除任何问题,因为并行循环可能仍会充分利用所有可用的池线程。
无论如何,使用 Parallel 进行 IO 是一种反模式,因为系统选择的 DOP 几乎总是一个糟糕的选择。 TPL 不知道如何有效地安排 IO。
你可以让地方2成为一个LongRunning
任务,这样它就不会依赖于线程池并且保证运行。
您还可以研究使用异步 IO,这样您就不再依赖于线程池了。
我在 WCF
应用程序的几个地方使用了一个 TaskParallel
库。
在一个地方,我像这样使用它:
地点 1
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 100 };
Parallel.ForEach(objList, options, recurringOrder =>
{
Task.Factory.StartNew(() => ProcessSingleRequestForDebitOrder(recurringOrder));
//var th = new Thread(() => ProcessSingleRequestForDebitOrder(recurringOrder)) { Priority = ThreadPriority.Normal };
//th.Start();
//ProcessSingleRequestForDebitOrder( recurringOrder);
});
在另一种方法中,我用过它:
地点 2
System.Threading.Tasks.Task.Factory.StartNew(() => ProcessTransaction(objInput.Clone()));
问题是两个地方之间的时间片。也就是说,如果我调用了并行循环正在 Place 2 处理数百条记录的方法,我在 Place 1 的线程正在等待所有记录都已处理。可以告诉我如何对处理进行时间分割吗?
我正在使用来自 .net 3.5 的任务并行库;
问题是您在位置 1 中产生了很多任务,而位置 2 现在正在排队。位置 1 中的并行循环什么都不做,因为正文只启动一个很快完成的任务。
可能,您应该从位置 1 中删除 StartNew 事物,以便降低并行度。我不确定这是否会完全消除任何问题,因为并行循环可能仍会充分利用所有可用的池线程。
无论如何,使用 Parallel 进行 IO 是一种反模式,因为系统选择的 DOP 几乎总是一个糟糕的选择。 TPL 不知道如何有效地安排 IO。
你可以让地方2成为一个LongRunning
任务,这样它就不会依赖于线程池并且保证运行。
您还可以研究使用异步 IO,这样您就不再依赖于线程池了。