Я тестирую работающий Python через Process.Start параллельно
Моя машина имеет процессор 2,8 ГГц с 4 ядрами и 8 логическими процессорами
Мое основное консольное приложениекак показано ниже
static void Main(string[] args) => MainAsync(args).GetAwaiter().GetResult();
static async Task MainAsync(string[] args)
{
var startTime = DateTime.UtcNow;
Console.WriteLine($"Execution started at {DateTime.UtcNow:T}");
await ExecuteInParallelAsync(args).ConfigureAwait(false);
Console.WriteLine($"Executions completed at {DateTime.UtcNow:T}");
var endTime = DateTime.UtcNow;
var duration = (endTime - startTime);
Console.WriteLine($"Execution took {duration.TotalMilliseconds} milliseconds {duration.TotalSeconds} seconds");
Console.WriteLine("Press Any Key to close");
Console.ReadKey();
}
Где ExecuteInParallelAsync - метод, выполняющий эту работу ...
private static async Task ExecuteInParallelAsync(string[] args)
{
var executionNumbers = new List<int>();
var executions = 5;
for (var executionNumber = 1; executionNumber <= executions; executionNumber++)
{
executionNumbers.Add(executionNumber);
}
await executionNumbers.ParallelForEachAsync(async executionNumber =>
{
Console.WriteLine($"Execution {executionNumber} of {executions} {DateTime.UtcNow:T}");
ExecuteSampleModel();
Console.WriteLine($"Execution {executionNumber} complete {DateTime.UtcNow:T}");
}).ConfigureAwait(false);
}
ExecuteSampleModel запускает модель Python ...
IModelResponse GetResponse()
{
_actualResponse = new ModelResponse();
var fileName = $@"main.py";
var p = new Process();
p.StartInfo = new ProcessStartInfo(@"C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe", fileName)
{
WorkingDirectory = RootFolder,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
p.Start();
_actualResponse.RawResponseFromModel = p.StandardOutput.ReadToEnd();
p.WaitForExit();
return _actualResponse;
}
Как вы можете видеть, я прошу эту модель быть выполненной 5 раз
Когда я использую отладчик, это выглядит так, как будто даже при использовании ParalellForEach (представленного пакетом AsyncEnumerator) она не запускается параллельно
Я думал, что каждая итерация выполняется в своем собственном потоке?
Каждое выполнение модели Python занимает 5 секунд.
Параллельно с выполнением, я ожидал бы, что весь процесс будет выполненчерез 15 секунд или около того, но на самом деле это занимает 34 секунды
Console.WriteLines, добавленные до и после вызова GetResponse, показывают, что первый вызов начинается и выполняется вполный, затем запускается второй и т. д.
Это как-то связано со мной, вызывая Process.Start?
Может кто-нибудь увидеть что-то не так с этим?
Пол