当前位置: 首页 > 面试题库 >

MaxDegreeOfParallelism做什么?

松秦斩
2023-03-14
问题内容

我正在使用Parallel.ForEach并且正在进行一些数据库更新,现在没有设置MaxDegreeOfParallelism,双核处理器机器会导致sql客户端超时,而其他四核处理器机器会以某种方式不会超时。

现在,我无法控制运行代码的处理器类型,但是我可以使用MaxDegreeOfParallelism更改某些设置,这些设置可能会同时运行较少的操作,并且不会导致超时吗?

我可以增加超时时间,但这不是一个好的html" target="_blank">解决方案,如果在较低的CPU上我可以同时处理较少的操作,则可以减轻cpu的负担。

好的,我也阅读了所有其他文章和MSDN,但是将MaxDegreeOfParallelism设置为较低的值会使我的四核计算机受苦吗?

例如,如果CPU有两个内核,则使用20,如果CPU有四个内核,则使用40?


问题答案:

答案是,这是整个并行操作的上限,与内核数无关。

因此,即使由于等待IO或锁定而没有使用CPU,也不会并行运行额外的任务,只会执行您指定的最大值。

为了找到答案,我编写了这段测试代码。那里有一个人为锁,以刺激TPL使用更多线程。当您的代码等待IO或数据库时,也会发生同样的情况。

class Program
{
    static void Main(string[] args)
    {
        var locker = new Object();
        int count = 0;
        Parallel.For
            (0
             , 1000
             , new ParallelOptions { MaxDegreeOfParallelism = 2 }
             , (i) =>
                   {
                       Interlocked.Increment(ref count);
                       lock (locker)
                       {
                           Console.WriteLine("Number of active threads:" + count);
                           Thread.Sleep(10);
                        }
                        Interlocked.Decrement(ref count);
                    }
            );
    }
}

如果我未指定MaxDegreeOfParallelism,则控制台日志将显示最多同时运行约8个任务。像这样:

Number of active threads:6
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:6
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7

它开始时较低,随时间增加,最后尝试同时运行8。

如果我将其限制为任意值(例如2),我得到

Number of active threads:2
Number of active threads:1
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2

哦,这是在四核计算机上。



 类似资料:
  • 问题内容: 我正在阅读一本有关html开发的书(我还比较陌生),尽管该书一个月前(2011年11月)才刚刚出版,但作者是一位经验丰富的编码人员,也许可以用于行动形式是老派? 因为我试图获得示例代码的要点,但是尽管进行了搜索,却找不到解释。 在Google,SO和www.w3schools.com上。 有人知道该动作对表格意味着什么吗? 问题答案: 动作通常指定提交表单的文件/页面(使用方法参数中所

  • 问题内容: 为什么我们需要特定于数据库的功能,例如mysql_real_escape_string()?addlashes()不能做什么? 暂时忽略了参数化查询的高级替代方案,是一个仅使用addlashes()的web应用仍然容易受到SQL注入的攻击,如果是,怎么办? 问题答案: 当处理多字节编码的字符串时,加号通常不够好。

  • 问题内容: 我有以下代码: 据我了解,我创建了一个按钮,上面写着“清除”。然后,我必须将一个动作与此按钮关联(如果按下该按钮会发生什么),并由完成。这样对吗? 但是我不知道该在哪里指定动作。按下按钮应该清除文本区域,据我所知,应该在某处有代码清除文本区域。但是在给定的示例中, 。的参数中只有“ this” 。 程序如何知道按下按钮时应清除文本区域? 如果需要,请在此处给出完整的代码。 问题答案:

  • 问题内容: 显示在Netty 4升级文档中。您能解释一下它的作用吗? 谢谢! 问题答案: 这是一个通过套接字的选项,用于确定排队的连接数。 http://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html 传入连接指示(连接请求)的最大队列长度设置为backlog参数。如果在队列已满时出现连接指示,则拒绝连接。 有关网络渠道的更

  • 问题内容: JavaDoc说: 我知道C#中有什么,但是这个标量和C#标量似乎绝对不同。 问题答案: 这是在声明您希望查询结果返回单个命名列的对象,而不是实体。例如 将返回一个。如果您指定多个标量,则结果将以的数组形式返回。与之类似,除了它适用于命名列,并且可以返回复合结果。

  • 问题内容: Hibernate.initialize做什么? 通常提到的文档只谈论 有什么意义吗 问题答案: 如果实体具有延迟初始化的字段(例如,一些较大的BLOB或CLOB数据或延迟的一对一关联),我会说是。见20.1.8。在前者的文档中,在20.1.3中。 也可以看看: 20.1.4。初始化集合和代理