C# 并行编程:创建一定数量的进程和相关数据/工作
我需要根据用户PC的逻辑核数量,在不同的进程上分配工作负载。 工作负载由以下代码完成:C# 并行编程:创建一定数量的进程和相关数据/工作,c#,multithreading,parallel-processing,task-parallel-library,multiprocessing,C#,Multithreading,Parallel Processing,Task Parallel Library,Multiprocessing,我需要根据用户PC的逻辑核数量,在不同的进程上分配工作负载。 工作负载由以下代码完成: static void work() { WorkData myData = new WorkData(); Worker myWorker = new Worker(myData); MyWorker.doWork() } 我使用此代码计算逻辑核数: int nbProcessors = 1; foreach (var item in new System.Management.M
static void work()
{
WorkData myData = new WorkData();
Worker myWorker = new Worker(myData);
MyWorker.doWork()
}
我使用此代码计算逻辑核数:
int nbProcessors = 1;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
nbProcessors = Convert.ToInt32(item["NumberOfLogicalProcessors"]);
}
现在,我必须在逻辑核上共享工作,从而完成10000次我的工作(),因此在我的pc机上,这意味着启动8个进程,每个进程1250次迭代。
我还需要每个进程都有自己的数据,这样就不会产生冲突
我该怎么做呢?看看:
它将在内核之间自动拆分。但是如果需要,您可以手动设置线程数我认为您应该查看方法和方法。这两个类都依赖于当前的工作站配置,因此您可以轻松地在任务中使用它们 并行使用示例: : : 评论更新: (Parralel类)在内部使用Threading.Tasks命名空间,其中一些进程管理: 线程池上线程的调度 另外两个链接关于:和。我认为第二个链接可以帮助您平衡数据的工作 如果可能,如果工作负载变得不平衡,调度程序会在多个线程和处理器之间重新分配工作
嗯,您知道可以通过访问属性获取逻辑处理器计数:
Environment.ProcessorCount
在我的四核HT机器上返回8-有点像签出
如果您有固定的迭代次数(而不是对列表或其他内容进行迭代)
然后你可以选择:
var parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelistm = Environment.ProcessorCount
};
//edited per comment
Parallel.For(0, 10000, parallelOptions, () =>
{
WorkData myData = new WorkData();
Worker myWorker = new Worker(myData);
MyWorker.doWork()
});
如果必须对列表进行一些分区,那么partitioner将发挥作用:
var partitioner = Partitioner.Create(yourList);
var parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
};
Parallel.ForEach(partitioner, parallelOptions, (listItem, loopState) =>
{
//Do something
}
尽管请注意,默认情况下,并行
循环产生的线程数量与内核数量相同。由于可以使用C#4.0,它会自动进行负载平衡:
Parallel.For(0, 10000, p => work());
或
请参阅:查看线程指南。以非常容易理解的方式从非常基本的线程到并行编程。
简而言之,这是c#4.0一书中的5章。
就我个人而言,这对我更好地理解线程有很大帮助。有什么原因你不能使用
Parallel.ForAll()
?如果我没弄错,那就是Parallel。因为线程池只是在一个进程中进行多线程处理,不是吗?事实上,如果我使用iterationspecore=10000/Environment.ProcessorCount;PParallel.For(0,iterationsPerCore…它在8个核心之间共享1250个迭代
var parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelistm = Environment.ProcessorCount
};
//edited per comment
Parallel.For(0, 10000, parallelOptions, () =>
{
WorkData myData = new WorkData();
Worker myWorker = new Worker(myData);
MyWorker.doWork()
});
var partitioner = Partitioner.Create(yourList);
var parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
};
Parallel.ForEach(partitioner, parallelOptions, (listItem, loopState) =>
{
//Do something
}
Parallel.For(0, 10000, p => work());
ParallelEnumerable.Range(0, 10000).ForAll(p => work());