Параллельная обработка Powershell: как установить значение в глобальной переменной

Я вызываю API 500 раз с 10 параллельными потоками в рамках нагрузочного тестирования. Я хочу зафиксировать результат вызова API в глобальной переменной (счетчик вне области блока сценария), чтобы я мог продолжить обработку для проверки.

Пример. В приведенном ниже коде я хочу проверить, все ли вызовы API 500 успешны или нет.

Фрагмент кода PFB-

$invokeAPI =
{
  try {
    $bodyContent = Get-Content $Using:inputFilepath
    $Response = (Invoke-WebRequest -Method 'Post' -Uri $Using:headUri -Headers $Using:blobHeaders  -Body $bodyContent).StatusCode
    
    Write-Host -BackgroundColor Green "status Code :" $Response
  }
  catch [System.Exception] {
    Write-Host -ForegroundColor Red "Exception caught while invoking API :" $_.ErrorDetails.Message
    [int]$_.Exception.Response.StatusCode
  }
} 

1..500 | ForEach-Object -Parallel $invokeAPI -ThrottleLimit 10

<# ToDo...Capture API invocation Result to validate results#>

person suraj_123    schedule 10.12.2020    source источник


Ответы (1)


Обновлено:

Оказалось, что я слишком усложнил свой первоначальный ответ, подумав, что рабочие места будут необходимы. Но похоже, что это не так. Похоже, это должно быть так же просто, как просто вывод в переменную.

Пример скрипта, который будет случайным образом проверять различные HTTP-статусы:

$invokeAPI = {
  try {
    $statusCode = 200,200,200,200,200,301,400,404,500 | Get-Random;
    (iwr "http://httpbin.org/status/$statusCode").StatusCode;
  }
  catch {
    [int]$_.Exception.Response.StatusCode;
  };
};

$statuscodes = 1..20 | % -Parallel $invokeAPI -ThrottleLimit 5;

$statuscodes;

СТАРОЕ. Я думал, что вам понадобятся вакансии, но оказалось, что нет, см. Правку выше.

Измените это:

1..500 | ForEach-Object -Parallel $invokeAPI -ThrottleLimit 10

К этому:

$output = 1..500 | ForEach-Object -Parallel $invokeAPI -ThrottleLimit 10 -AsJob | Wait-Job | Receive-Job
$output

Объяснение:

  • -AsJob - заставляет его запускать каждую задачу как задание PowerShell в фоновом режиме.
  • Wait-Job - Дождитесь завершения работ
  • Receive-Job - Получить данные возврата для всех заданий

Запустив -AsJob, он сохранит результаты в фоновом режиме. Затем вы можете получить задание, которое представляет собой сохраненные результаты вывода этого задания.

Благодарность: https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature/

Фактически, ваш пример очень похож на этот пример в документации: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-7.1#example-13-run-in-parallel-as-a-job

person Chad Baldwin    schedule 10.12.2020
comment
Спасибо .. Это очень помогло. У меня еще один вопрос, где именно хранится результат каждого задания. Во время отладки я проверял свойства объекта дочернего задания. Я не видел, чтобы код ответа API (в моем случае) нигде сохранялся. Я что-то упустил. Это может быть очень простой вопрос. Но я новичок в написании сценариев PowerShell. - person suraj_123; 10.12.2020
comment
@ suraj_123 похоже, что в Джобс нет необходимости. Я обновил свой ответ более простым решением .... просто выведите свой код в переменную. - person Chad Baldwin; 10.12.2020