Zai*_*sud 10 .net c# task-parallel-library parallel-for c#-4.0
我需要ThreadPool每晚运行大约1,000个任务(这个数字可能会在未来增长).每个任务都执行长时间运行的操作(从Web服务读取数据),并且不是CPU密集型的.Async I/O不是这个特定用例的选项.
给定一个IList<string>参数,我需要DoSomething(string x).我试图在以下两个选项之间进行选择:
IList<Task> tasks = new List<Task>();
foreach (var p in parameters)
{
tasks.Add(Task.Factory.StartNew(() => DoSomething(p), TaskCreationOptions.LongRunning));
}
Task.WaitAll(tasks.ToArray());
Run Code Online (Sandbox Code Playgroud)
要么
Parallel.ForEach(parameters, new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount*32}, DoSomething);
Run Code Online (Sandbox Code Playgroud)
哪个选项更好,为什么?
注意 :
答案应包括使用TaskCreationOptions.LongRunning和的比较MaxDegreeOfParallelism = Environment.ProcessorCount * SomeConstant.
Chr*_*ens 35
也许你没有意识到这一点,但是Parallel类中的成员只是Task对象周围的(复杂)包装器.如果您想知道,Parallel该类会创建Task对象TaskCreationOptions.None.但是,MaxDegreeOfParallelism无论将任何创建选项传递给任务对象的构造函数,都会影响这些任务对象.
TaskCreationOptions.LongRunning给底层提供了一个"提示" TaskScheduler,它可能会在超额预订线程时表现更好.超额订阅适用于具有高延迟的线程,例如I/O,因为它会将多个线程(是线程,而不是任务)分配给单个内核,以便它总是有事情要做,而不是等待线程处于等待状态时完成的操作.在TaskScheduler使用ThreadPool它时,它将在自己的专用线程上运行LongRunning任务(唯一的情况是每个任务都有一个线程),否则它将正常运行,具有调度和工作窃取(真的,无论如何你想要的东西)
MaxDegreeOfParallelism控制运行的并发操作数.它类似于指定数据将被拆分和处理的最大分区数.如果TaskCreationOptions.LongRunning能够指定,那么所有这一切都将限制一次运行的任务数量,类似于TaskScheduler其最大并发级别设置为该值的类似于此示例.
你可能想要Parallel.ForEach.但是,添加MaxDegreeOfParallelism等于如此高的数字实际上并不能保证会有多个线程同时运行,因为任务仍然会受到控制ThreadPoolTaskScheduler.该调度程序将一次运行的线程数量尽可能地减少,我想这是两种方法之间的最大差异.你可以编写(并指定)你自己的TaskScheduler模仿最大程度的并行行为,并且两全其美,但我怀疑你有兴趣做些什么.
我的猜测是,根据延迟和您需要执行的实际请求的数量,使用任务在许多(?)情况下会表现更好,但最终会占用更多内存,而并行将在资源使用方面更加一致.当然,异步I/O将比这两个选项中的任何一个都更好地执行,但我知道你不能这样做,因为你使用的是遗留库.所以,不幸的是,无论你选择哪一个,你都会陷入平庸的表现.
一个真正的解决方案是找出一种方法来实现异步I/O; 因为我不知道情况,我认为我不能比这更有帮助.您的程序(读取,线程)将继续执行,内核将等待I/O操作完成(这也称为使用I/O完成端口).由于线程未处于等待状态,因此运行时可以在较少的线程上执行更多操作,这通常最终会在内核数量和线程数之间建立最佳关系.按照我希望的方式添加更多线程并不等同于更好的性能(实际上,它通常会损害性能,因为像上下文切换这样的事情).
但是,在确定问题的最终答案时,这整个答案毫无用处,尽管我希望它会给你一些必要的指导.在分析之前,您不会知道什么表现更好.如果你不同时尝试它们(我应该澄清我的意思是没有LongRunning选项的任务,让调度程序处理线程切换)并对它们进行分析以确定什么对你的特定用例最好,你卖得很短.
| 归档时间: |
|
| 查看次数: |
19148 次 |
| 最近记录: |