Parallel.Foreach在幕后做什么? - c#

所以我只是在这里无法理解这个概念。
我有一个使用Parallel类和Foreach方法的方法。
但是我不明白的是,它会创建新线程以便更快地运行该函数吗?

让我们以此为例。
我做一个普通的foreach循环。

private static void DoSimpleWork()
        {
            foreach (var item in collection)
            {
                //DoWork();
            }
        }

所要做的是,它将获得列表中的第一项,并分配方法DoWork();。直到它完成。简单,朴素且可行。

现在..我有三种情况很好奇
如果我这样做。

Parallel.ForEach(stringList, simpleString =>
            {
                DoMagic(simpleString);
            });

这会将Foreach分成4个块吗?
所以我认为正在发生的事情是,它采用列表中的前4行,将每个字符串分配给每个“线程”(假设并行创建了4个虚拟线程),然后从该列表中的下4个开始?
如果那是错误的,请纠正我,我真的很想了解这是如何工作的。

然后我们有这个。
本质上是相同的,但是有一个新参数

Parallel.ForEach(stringList, new ParallelOptions() { MaxDegreeOfParallelism = 32 }, simpleString =>
            {
                DoMagic(simpleString);
            });

我很好奇的是

new ParallelOptions() { MaxDegreeOfParallelism = 32 }

这是否意味着它将从该列表中获取前32个字符串(如果列表中甚至有那么多字符串),然后执行与我上面所讨论的相同的事情?

最后一个。

Task.Factory.StartNew(() =>
            {
                Parallel.ForEach(stringList, simpleString =>
                {
                    DoMagic(simpleString);
                });
            });

这样会创建一个新任务,将每个“块”分配给它自己的任务吗?

参考方案

不要将异步代码与并行代码混合使用。任务是异步操作-查询数据库,读取文件,等待一些相对便宜的操作,以使您的UI不会被阻塞和无响应。

并行是不同的。这是为1)多核系统和2)计算密集型操作而设计的。我不会详细介绍它是如何工作的,可以在MS文档中找到此类信息。长话短说,Parallel。最有可能由自己决定何时以及如何运行。它可能会违反您的参数,即MaxDegreeOfParallelism或其他参数。总体思路是提供最佳的并行度,从而尽快完成您的操作。

在for循环中创建新线程并传递参数 - c#

考虑以下代码:for(int i = 0; i < 10; i ++) { new Thread(() => Test(i)).Start(); } Test(int i)函数:public void Test(int i) { Console.WriteLine("=== Test " + i); } 实际输出: ===测试…

线程和多处理模块之间有什么区别? - python

我正在学习如何在Python中使用threading和multiprocessing模块来并行运行某些操作并加速我的代码。我发现很难理解(也许是因为我没有任何理论背景)要理解threading.Thread()对象和multiprocessing.Process()对象之间的区别。另外,对我来说,如何实例化一个作业队列并使其只有4个(例如)并行运行,而另一个…

并行调用List的方法? - java

我必须遍历一个列表,并为每个对象调用一个方法,但是要并行进行。循环之后,还有其他语句,必须等待并行方法调用。如何在JAVA中做到这一点?public void a(List<Object> list) { for(Object o : list) { asynchMethod(o); // this n method call must run …

TransformBlock之后如何写入对象? - c#

我有一个需要迭代并行处理的对象的列表。这是我需要做的:foreach (var r in results) { r.SomeList = await apiHelper.Get(r.Id); } 由于我想对其进行parellelize,因此我尝试使用Parallel.ForEach(),但它没有等到所有事情都完成之后才开始使用apiHelper.Get()正…

Tensorflow:具有num_parallel_calls的数据集映射没有加速 - python

我正在使用TensorFlow和tf.data.Dataset API执行一些文本预处理。在我的num_parallel_calls调用中不使用dataset.map时,预处理10K记录需要0.03s。当我使用num_parallel_trials=8(计算机上的内核数)时,也需要0.03s来预处理10K记录。我四处搜寻,发现了以下内容:Parallelis…