我有一个我想在C#中重写的Python脚本,可以使用多处理。我一直在阅读有关C#多线程和多处理的信息,我感到非常困惑。许多文章建议使用TPL或诸如Parrallel.foreach。但许多页面首先提及多个核心,然后迅速切换回谈论线程。在Python中,我必须专门使用多处理模块来实现这一目标(请参阅:多处理与螺纹Python(
我写了一个小型示例控制台应用程序以测试:
class Program
{
static void Main(string[] args)
{
List<int> testList = new List<int>();
testList.AddRange(Enumerable.Range(1, 20));
Parallel.ForEach(testList, x => Console.WriteLine(Test(x)));
Console.ReadLine();
}
private static string Test(int i)
{
Thread.Sleep(1000 * (21 - i));
return "P: " + Process.GetCurrentProcess().Id.ToString() + ", T: " + Thread.CurrentThread.ManagedThreadId.ToString();
}
}
但是,它显示一个过程ID和多个线程ID。现在,我不确定我的方法是否正确,是否正确理解所有内容。
要提供一些背景,我的应用程序需要在少量数据集( -300个数据点(上进行大量计算,但是由于参数的大量组合,我需要尽可能快地运行以节省时间。
基本上我想知道的是平行。Foreach线程将在不同的内核上自动运行或我需要做其他事情。
Microsoft .NET运行时映射.NET线程到Windows线程1:1(因此每个.NET线程是Windows OS线程(。Windows调度程序通常将不同的Windows线程安排到不同的CPU内核。所以你不必做任何事情。
一如既往地记住,线程是"昂贵"的对象。除非您可以为每个线程进行"太多"工作,否则使用它们是没有用的(除非您有非常具体的必需品,否则不要将线程用于工作单位&lt; 1秒(