有没有办法使用更多线程来运行单个方法调用?

时间:2019-04-25 15:16:44

标签: c# parallel-processing async-await sumo

我目前正在我的大学里使用交通信号灯进行一个项目。我将SUMO用作仿真程序,但偶然发现TraCI库用于控制交通灯。

我已经编写了一种遗传算法,但是我有一个问题,从本质上讲,这是一个瓶颈,以至于没有微粒可以通过,这就是仿真程序本身。

从同一程序(我的程序)控制多个客户端时,所有客户端都在2个线程上运行,在我的情况下,我有8个可用线程。我打算在多个线程中运行该程序是为了使程序运行更快,因为即使我仅模拟了约40分钟的流量,100次模拟也需要大约1.5个小时才能完成。

我在下面介绍了初始化,启动客户端和控制它们的方法。

罪魁祸首可能是最后一个for循环中的两个方法调用(控制交通信号灯的那个)

所以我的问题是,如何并行化以在多个线程上运行,以便程序运行更快?

最好的问候

private async Task RunSimulationAsync()
    {
        List<TraCIClient> listOfClients = new List<TraCIClient>();
        List<SimulationCommands> listOfSimulations = new List<SimulationCommands>();
        List<TrafficLightCommands> listOfTrafficLights = new List<TrafficLightCommands>();

        //initialize clients, simulationCommands and trafficlightCommands used for controlling sumo
        for (int i = 0; i < numberOfInstances; ++i)
        {
            listOfClients.Add(new TraCIClient());
            listOfSimulations.Add(new SimulationCommands(listOfClients[i]));
            listOfTrafficLights.Add(new TrafficLightCommands(listOfClients[i]));
        }

        //open SUMO clients
        for (int i = 0; i < numberOfInstances; ++i)
        {
            OpenSumo(portNumber, sumoOutputFilePath + $"{i}.xml");
            await listOfClients[i].ConnectAsync("127.0.0.1", portNumber);
            ++portNumber;
        }

        // control trafficlights in simulation
        for (int i = 0; i < dnaSize; ++i)
        {
            for (int j = 0; j < numberOfInstances; j++)
            {
                listOfTrafficLights[j].SetRedYellowGreenState("n0", $" {Population[j].genes[i]}");
                listOfClients[j].Control.SimStep();
            }
        } 

1 个答案:

答案 0 :(得分:0)

  

如何并行化以在多个线程上运行,以便程序运行更快?

首先,您需要确保所使用的库能够以并行方式被调用。并非全部。

第二,因为您有一个for索引,所以最直接的翻译是使用Parallel.For,例如:

for (int i = 0; i < dnaSize; ++i)
{
  Parallel.For(0, numberOfInstances, j =>
  {
    listOfTrafficLights[j].SetRedYellowGreenState("n0", $" {Population[j].genes[i]}");
    listOfClients[j].Control.SimStep();
  }
}

这将并行化到实例数。