Start-ThreadJob
Создает фоновые задания, аналогичные командлету Start-Job
.
Синтаксис
Start-ThreadJob
[-ScriptBlock] <ScriptBlock>
[-Name <String>]
[-InitializationScript <ScriptBlock>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-ThrottleLimit <Int32>]
[-StreamingHost <PSHost>]
[<CommonParameters>]
Start-ThreadJob
[-FilePath] <String>
[-Name <String>]
[-InitializationScript <ScriptBlock>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-ThrottleLimit <Int32>]
[-StreamingHost <PSHost>]
[<CommonParameters>]
Описание
Start-ThreadJob
создает фоновые задания, аналогичные командлету Start-Job
. Разница main заключается в том, что создаваемые задания выполняются в отдельных потоках локального процесса. По умолчанию задания используют текущий рабочий каталог вызывающей стороны, которая запустила задание.
Командлет также поддерживает параметр ThrottleLimit , чтобы ограничить количество одновременно выполняемых заданий. По мере запуска новых заданий они помещаются в очередь и ожидают, пока текущее число заданий не упадет ниже предела регулирования.
Примеры
Пример 1. Create фоновых заданий с ограничением потока 2
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } } -ThrottleLimit 2
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } }
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } }
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 ThreadJob Running True PowerShell 1..100 | % { sleep 1;...
2 Job2 ThreadJob Running True PowerShell 1..100 | % { sleep 1;...
3 Job3 ThreadJob NotStarted False PowerShell 1..100 | % { sleep 1;...
Пример 2. Сравнение производительности Start-Job и Start-ThreadJob
В этом примере показана разница между Start-Job
и Start-ThreadJob
. Задания выполняют командлет в Start-Sleep
течение 1 секунды. Так как задания выполняются параллельно, общее время выполнения составляет около 1 секунды, а также любое время, необходимое для создания заданий.
# start five background jobs each running 1 second
Measure-Command {1..5 | % {Start-Job {Start-Sleep 1}} | Wait-Job} | Select-Object TotalSeconds
Measure-Command {1..5 | % {Start-ThreadJob {Start-Sleep 1}} | Wait-Job} | Select-Object TotalSeconds
TotalSeconds
------------
5.7665849
1.5735008
После вычитания 1 секунды для времени выполнения вы увидите, что Start-Job
создание пяти заданий занимает около 4,8 секунды. Start-ThreadJob
в 8 раз быстрее, что занимает около 0,6 секунды, чтобы создать пять заданий. Результаты могут отличаться в вашей среде, но относительные улучшения должны быть одинаковыми.
Пример 3. Create заданий с помощью InputObject
В этом примере блок скрипта $input
использует переменную для получения входных данных из параметра InputObject . Это также можно сделать путем отправки объектов в Start-ThreadJob
.
$j = Start-ThreadJob -InputObject (Get-Process pwsh) -ScriptBlock { $input | Out-String }
$j | Wait-Job | Receive-Job
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
94 145.80 159.02 18.31 18276 1 pwsh
101 163.30 222.05 29.00 35928 1 pwsh
$j = Get-Process pwsh | Start-ThreadJob -ScriptBlock { $input | Out-String }
$j | Wait-Job | Receive-Job
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
94 145.80 159.02 18.31 18276 1 pwsh
101 163.30 222.05 29.00 35928 1 pwsh
Пример 4. Stream выходных данных задания на родительский узел
С помощью параметра StreamingHost можно указать, что задание направляет все выходные данные узла на определенный узел. Без этого параметра выходные данные поступают в коллекцию потока данных задания и не отображаются в консоли узла, пока вы не получите выходные данные задания.
В этом примере текущий узел передается в Start-ThreadJob
с помощью автоматической переменной $Host
.
PS> Start-ThreadJob -ScriptBlock { Read-Host 'Say hello'; Write-Warning 'Warning output' } -StreamingHost $Host
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
7 Job7 ThreadJob NotStarted False PowerShell Read-Host 'Say hello'; ...
PS> Say hello: Hello
WARNING: Warning output
PS> Receive-Job -Id 7
Hello
WARNING: Warning output
PS>
Обратите внимание, что отображается запрос из Read-Host
, и вы можете ввести входные данные. Затем отобразится сообщение из Write-Warning
. Командлет Receive-Job
возвращает все выходные данные задания.
Пример 5. Загрузка нескольких файлов одновременно
Командлет Invoke-WebRequest
может скачивать только один файл одновременно. В следующем примере используется Start-ThreadJob
для создания нескольких заданий потоков для одновременного скачивания нескольких файлов.
$baseUri = 'https://github.com/PowerShell/PowerShell/releases/download'
$files = @(
@{
Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.msi"
OutFile = 'PowerShell-7.3.0-preview.5-win-x64.msi'
},
@{
Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.zip"
OutFile = 'PowerShell-7.3.0-preview.5-win-x64.zip'
},
@{
Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.msi"
OutFile = 'PowerShell-7.2.5-win-x64.msi'
},
@{
Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.zip"
OutFile = 'PowerShell-7.2.5-win-x64.zip'
}
)
$jobs = @()
foreach ($file in $files) {
$jobs += Start-ThreadJob -Name $file.OutFile -ScriptBlock {
$params = $using:file
Invoke-WebRequest @params
}
}
Write-Host "Downloads started..."
Wait-Job -Job $jobs
foreach ($job in $jobs) {
Receive-Job -Job $job
}
Параметры
-ArgumentList
Задает массив аргументов или значений параметров для скрипта, заданного параметрами FilePath или ScriptBlock .
ArgumentList должен быть последним параметром в командной строке. Все значения, следующие за именем параметра, интерпретируются значениями в списке аргументов.
Type: | Object[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-FilePath
Указывает файл скрипта для запуска в качестве фонового задания. Введите путь и имя файла скрипта. Сценарий должен находиться на локальном компьютере или в папке, доступ к которым имеет локальный компьютер.
При использовании этого параметра PowerShell преобразует содержимое указанного файла скрипта в блок скрипта и запускает его в качестве фонового задания.
Type: | String |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-InitializationScript
Указывает команды, выполняемые перед запуском задания. Заключите команды в фигурные скобки ({}
), чтобы создать блок скрипта.
Используйте этот параметр для подготовки сеанса, в рамках которого выполняется задание. Например, его можно использовать для добавления функций и модулей в сеанс.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-InputObject
Указывает объекты, используемые в качестве входных данных для блока скрипта. Он также позволяет вводить входные данные конвейера. Используйте автоматическую $input
переменную в блоке скрипта для доступа к входным объектам.
Type: | PSObject |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-Name
Указывает понятное имя нового задания. Имя можно использовать для идентификации задания в других командлетах задания, таких как Stop-Job
командлет .
Понятное имя по умолчанию — Job#, где «#» — порядковый номер, который увеличивается для каждого задания.
Type: | String |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-ScriptBlock
Указывает команды, которые нужно выполнить в фоновом задании. Заключите команды в фигурные скобки ({}
), чтобы создать блок скрипта. Используйте автоматическую $Input
переменную для доступа к значению параметра InputObject . Это обязательный параметр.
Type: | ScriptBlock |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-StreamingHost
Этот параметр предоставляет потокобезопасный способ, позволяющий выходным Write-Host
данным переходить непосредственно к переданному в объекте PSHost . Без него выходные Write-Host
данные передаются в поток данных о задании и не отображаются в консоли узла до тех пор, пока задания не будут завершены.
Type: | PSHost |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-ThrottleLimit
Этот параметр ограничивает количество одновременно выполняемых заданий. По мере запуска заданий они помещаются в очередь и ожидают, пока поток не будет доступен в пуле потоков для выполнения задания. Ограничение по умолчанию — 5 потоков.
Размер пула потоков является глобальным для сеанса PowerShell. Указание ThrottleLimit в одном вызове устанавливает ограничение для последующих вызовов в том же сеансе.
Type: | Int32 |
Position: | Named |
Default value: | 5 |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Входные данные
Выходные данные
ThreadJob.ThreadJob