2

我有一个简单的 foreach 循环,它基于 while 循环和静态 int 来限制自己。如果我不限制它,如果我限制它,我的 CPU 会保持在 10% 以下,我的 CPU 会上升到 99/100%。如何安全地限制对 Paralell.Foreach 中某个类的调用次数?

static int ActiveThreads { get; set; }
static int TotalThreads { get; set; }

var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 1;
Parallel.ForEach(urlTable.AsEnumerable(),options,drow =>
{
    using (var WCC = new MasterCrawlerClass())
    {
        while (TotalThreads <= urlTable.Rows.Count)
        {
            if (ActiveThreads <= 9)
            {
                Console.WriteLine("Active Thread #: " + ActiveThreads);
                ActiveThreads++;
                WCC.MasterCrawlBegin(drow);
                TotalThreads++;
                Console.WriteLine("Done Crawling a datarow");
                ActiveThreads--;
            }
        }
    }
});

我需要限制它,是的,我知道 Max Parallelism 有它自己的限制,但是,在服务器中的 CPU 达到该限制之前,我的开关就会陷入困境。

4

2 回答 2

2

两件事情 :

1)您似乎没有使用您ParallelOptions()在此示例中创建的内容。

2)您可以使用Semaphoreif 出于某种原因您不想使用ParallelOptions.

 Semaphore sm = new Semaphore(0, 9);

 // increment semaphore or block if = 9
 // this will block gracefully without constantly checking for `ActiveThreads <= 9`
 sm.WaitOne();

 // decrement semaphore
 sm.Release();
于 2012-04-11T23:45:26.313 回答
1

我有一个简单的 foreach 循环,它基于 while 循环和静态 int 来限制自己。如果我不限制它,如果我限制它,我的 CPU 会保持在 10% 以下,我的 CPU 会上升到 99/100%。

这很奇怪。这可能是您限制循环并发的方式的结果,顺便说一句,这似乎导致每个循环drow被爬网多次。我怀疑那是你想要的。由于爬网操作受 IO 限制,您的 CPU 利用率较低。

如果您真的想将并发调用数限制MasterCrawlBegin为 9,请设置MaxDegreesOfParallelism = 9. and的while循环和维护TotalThreadsActiveThreads不起作用。作为旁注,您正在以非线程安全的方式递增和递减计数器。

将您的代码更改为如下所示。

int ActiveThreads = 0;
var options = new ParallelOptions(); 
options.MaxDegreeOfParallelism = 9; 
Parallel.ForEach(urlTable.AsEnumerable(),options,drow => 
{
  int x = Interlocked.Increment(ref ActiveThreads);
  Console.WriteLine("Active Thread #: " + x); 
  try
  {
    using (var WCC = new MasterCrawlerClass()) 
    { 
      WCC.MasterCrawlBegin(drow); 
    }
  }
  finally
  {
    Interlocked.Decrement(ref ActiveThreads);
    Console.WriteLine("Done Crawling a datarow"); 
  } 
}); 
于 2012-04-12T02:14:17.680 回答