首页 > 解决方案 > 从 powershell 函数调用多个 Azure 函数

问题描述

我有一个简单的 powershell 编排器,它只读取一个文本文件并发送部分列表以在 functionA 上处理。

$payLoad = Get-Content tracks.txt
[int]$itemCount = $payLoad.Count / 50

for ($i = 0; $i -le $payLoad.Count; $i++) {
    
    $payloadList += $payLoad[$i]
    if ($payloadList.Count -eq $itemCount) {
        Write-Host $payloadList
        Start-ThreadJob -Argumentlist $payloadList -Scriptblock {
            # Here I am filling urls etc.
            Invoke-RestMethod @params
        }
        $payloadList = @()
    }
}

我在列表中有近 1000 个项目,但始终只处理大约 200 个。我可以从协调器日志中看到,powershell 线程作业是为所有人创建的,但我的大部分作业在某处消失了。Azure 函数是否不支持这种调用函数的方式,或者我哪里出错了?

标签: powershellazure-functions

解决方案


我不太明白第一部分。您是否尝试一次处理 50 个项目?

块的典型结构Start-ThreadJob看起来更像这样:

# Divide $payloads into chunks of 50
$script:counter = 0
$payloads = Get-Content tracks.txt | Group-Object {[math]::Floor($script:counter++/50)}

# Process each job on separate threads (default throttle limit is 5)
# Save job IDs to $jobs
$jobs = $payloads | Foreach {
    Start-ThreadJob -ThrottleLimit 5 -ArgumentList $_.Group -ScriptBlock {
        Invoke-RestMethod @params
    }
}

# specifically, wait for all jobs to finish, and get their output:
$result = $jobs | Wait-Job | Receive-Job

您也可以$jobs自行运行以查看各个状态。或者,进行详细测试:

while ($jobs.count -gt ($jobs|? state -eq 'Completed').count) {
    Write-Progress -Activity 'Processing jobs' -PercentComplete (
        [math]::Round((($jobs|? state -eq 'Completed').count/$jobs.count)*100))
}
Write-Output "all jobs complete"

你能看到$jobs节目是否创造了所有 20 个工作岗位,它们的状态如何?


推荐阅读