Я пытаюсь запустить какой-нибудь скрипт в Powershell Core (без рабочего процесса, без опции -Parallel для ForEach).
Поэтому я пытаюсь разбить мой массив на партии и запустить их параллельно.Итак, я делаю:
$iterCount = 150000;
$threadCount = 8;
$batchSize = $iterCount/$threadCount;
$block = {
Param($range)
Foreach ($i in $range) {
...
}
}
For ($i = 0; $i -lt 150000; $i += $batchSize) {
Start-Job -Scriptblock $block -ArgumentList $i..$i+$batchSize
}
Но когда я звоню, я получаю
Start-Job : Cannot bind parameter 'InitializationScript'. Cannot convert the ".. 0+18750" value of type "System.String" to type "System.Management.Automation.Scr iptBlock".
At /home/tchain/dit/push_messages3.ps1:63 char:48
+ Start-Job -Scriptblock $block -ArgumentList $i..$i+$batchSize
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Start-Job], ParameterBindingExce ption
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Co mmands.StartJobCommand
Кажется, что ArgumentList
все строковое, поэтому я не могу передать диапазон.
Есть ли способ пройти строго типизированный диапазон?Есть ли лучший способ распараллелить цикл?Я хотел бы написать (0..150000).AsParallel().ForEach($i => ...)
Но похоже, что я не могу.
Я сделал Param([int] $from, [int] $to)
в качестве обходного пути, но я не уверен, что это лучшее, что я могу сделать.