有没有办法 运行 使用更多线程的单个方法调用?
Is there a way of running a single method call using more threads?
我目前正在大学里做一个交通灯项目。我正在使用 SUMO 作为我的模拟程序,我偶然发现了用于控制交通信号灯的 TraCI 库。
我编写了一个遗传算法,但我有一个问题,本质上是一个小到没有粒子可以通过的瓶颈,那就是模拟程序本身。
当从同一个程序(我的程序)控制多个客户端时,所有客户端 运行 在 2 个线程上,在我的例子中我有 8 个可用。我在多线程中 运行 运行程序的目的是,程序会 运行 更快,因为 100 次模拟需要大约 1.5 小时才能完成,即使我只模拟了大约 40 分钟的流量。
我在下面发布了初始化、启动客户端和控制它们的方法。
罪魁祸首可能是最后一个 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();
}
}
how can this be parallelized to run on multiple threads, so the program runs faster?
首先,您需要确保您使用的库能够以并行方式调用。并非所有人都是。
其次,由于您有一个 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();
}
}
这将并行化到实例数。
我目前正在大学里做一个交通灯项目。我正在使用 SUMO 作为我的模拟程序,我偶然发现了用于控制交通信号灯的 TraCI 库。
我编写了一个遗传算法,但我有一个问题,本质上是一个小到没有粒子可以通过的瓶颈,那就是模拟程序本身。
当从同一个程序(我的程序)控制多个客户端时,所有客户端 运行 在 2 个线程上,在我的例子中我有 8 个可用。我在多线程中 运行 运行程序的目的是,程序会 运行 更快,因为 100 次模拟需要大约 1.5 小时才能完成,即使我只模拟了大约 40 分钟的流量。
我在下面发布了初始化、启动客户端和控制它们的方法。
罪魁祸首可能是最后一个 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();
}
}
how can this be parallelized to run on multiple threads, so the program runs faster?
首先,您需要确保您使用的库能够以并行方式调用。并非所有人都是。
其次,由于您有一个 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();
}
}
这将并行化到实例数。