并行Foreach缓慢创建线程
我有一个需要并行处理的很多项目的IEnumerable。 这些项目不是CPU密集型的。 理想情况下,这些项目应该同时执行100个或更多的线程。
我试图用Parallel.ForEach()来做到这一点。 这有效,但问题是新线程产生得太慢。 在Parallel.Foreach()达到100个线程之前需要很长时间。 我知道有一个MaxDegreeOfParallelism属性,但这是最大值,而不是最小值。
有没有办法在100个线程上立即执行foreach? ThreadPool.SetMinThreads是我们宁愿避免的,因为它对整个过程有影响。
是否有自定义分区程序可能的解决方案?
我以5秒的超时时间ping了很多设备。 你如何尽可能快地做到这一点,只有4个线程(4个核心)?
我将假设您的ping设备位于局域网中,并且每个设备都可以通过IP地址进行识别和访问。
namespace PingManyDevices {
public class DeviceChecker {
public async Task<PingReply[]> CheckAllDevices(IEnumerable<IPAddress> devices) {
var pings = devices.Select(address => new Ping().SendPingAsync(address, 5000));
return await Task.WhenAll(pings);
}
/***
* Maybe push it a little further
***/
public async Task<PingReply[]> CheckAllDevices(IEnumerable<IPAddress> devices) {
var pings = devices.AsParallel().Select(address => new Ping().SendPingAsync(address, 5000));
return await Task.WhenAll(pings);
}
}
}
我已经成功使用ThreadPool而不是Parallel:
public static void ThreadForEach<T>(this IEnumerable<T> items, Action<T> action)
{
var mres = new List<ManualResetEvent>();
foreach (var item in items)
{
var mre = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem((i) =>
{
action((T)i);
mre.Set();
}, item);
mres.Add(mre);
}
mres.ForEach(mre => mre.WaitOne());
}
在我不得不使用它的情况下,它比使用Parallel.ForEach的尝试运行得更快。 我只能推测这是因为它试图使用已经存在的线程(而不是花费开销来创建新线程)。
链接地址: http://www.djcxy.com/p/50173.html上一篇: Parallel Foreach slow creation of the threads
下一篇: What is the advantage of a parallel pipeline compared with Task Parallelism?