Есть ли способ запустить один вызов метода с использованием нескольких потоков? - PullRequest
0 голосов
/ 25 апреля 2019

В настоящее время я работаю над проектом в моем университете с светофорами. Я использую 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();
            }
        } 

1 Ответ

0 голосов
/ 25 апреля 2019

как это можно распараллелить для запуска в нескольких потоках, чтобы программа работала быстрее?

Во-первых, вы должны быть уверены, что используемая вами библиотека может вызываться параллельно. Не все из них.

Во-вторых, поскольку у вас есть индекс 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();
  }
}

Это будет распараллелено на количество экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...