#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 похоже, что работа на самом деле не нужна. Я обновил свой ответ более простым решением…. просто выведите свой код в переменную.