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

#powershell #powershell-7.0

#powershell #powershell-7.0

Вопрос:

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

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

Фрагмент кода 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#>
 

Ответ №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

Комментарии:

1. Спасибо.. Это очень помогло. У меня есть еще один вопрос, где именно хранится результат каждого задания. Я проверял свойства объекта дочернего задания во время отладки. Я не видел, чтобы код ответа API (в моем случае) где-либо хранился. Я что-то упускаю из виду? Это может быть очень простой вопрос. Но я очень новичок в написании сценариев powershell.

2. @suraj_123 похоже, что работа на самом деле не нужна. Я обновил свой ответ более простым решением…. просто выведите свой код в переменную.