Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Function SomeFunction
- {
- Param(
- [String]$SampleParam
- )
- return $SampleParam.ToUpper()
- }
- $JobScript = [scriptblock]{
- $inQueue = [System.Collections.Concurrent.ConcurrentQueue[string]]$args[0]
- $outBag = [System.Collections.Concurrent.ConcurrentBag[string]]$args[1]
- $currentItem = $null
- while($inQueue.TryDequeue([ref] $currentItem) -eq $true)
- {
- try
- {
- # Add result to OutBag
- $result = SomeFunction -SampleParam $currentItem -EA Stop
- $outBag.Add( $result )
- }
- catch
- {
- # Catch error
- Write-Output $_.Exception.ToString()
- }
- }
- }
- $inData = [System.Collections.Concurrent.ConcurrentQueue[string]]::new(
- [String[]](@(1..10000) | % { return [guid]::NewGuid().ToString() }) # Sample strings in lower case
- )
- $resultData = [System.Collections.Concurrent.ConcurrentBag[string]]::new()
- # Wait for queue to empty
- $i_cur = $inData.Count
- $i_max = $i_cur
- # Start jobs
- $jobs = @(1..20) | % { Start-RSJob -ScriptBlock $JobScript -ArgumentList @($inData, $resultData) -FunctionsToImport @('SomeFunction') }
- # Wait queue to empty
- while($i_cur -gt 0)
- {
- Write-Progress -Activity 'Doing job' -Status "$($i_cur) left of $($i_max)" -PercentComplete (100 - ($i_cur / $i_max * 100))
- Start-Sleep -Seconds 3 # Update frequency
- $i_cur = $inData.Count
- }
- # Wait jobs to complete
- $logs = $jobs | % { Wait-RSJob -Job $_ } | % { Receive-RSJob -Job $_ }
- $jobs | % { Remove-RSJob -Job $_ }
- $Global:resultData = $resultData
- $Global:logs = $logs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement