Start-ThreadJob (ThreadJob)
Start-ThreadJob
- Модуль:
- 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. Основное отличие состоит в том, что создаваемые задания выполняются в отдельных потоках внутри локального процесса. По умолчанию задания используют текущий рабочий каталог вызывающей стороны, запустившей задание.
Командлет также поддерживает параметр ThrottleLimit, позволяющий ограничить количество одновременно выполняемых заданий. По мере запуска большего количества заданий они ставятся в очередь и ждут, пока текущее количество заданий не упадет ниже предела регулирования.
Примеры
Пример 1. Создание фоновых заданий с ограничением количества потоков, равным 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. Создание заданий с помощью 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. Потоковая передача вывода задания на родительский хост
Используя параметр 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 должен быть последним параметром в командной строке. Все значения, следующие за именем параметра, являются интерпретируемыми значениями в списке аргументов.
- Тип :
Object[]
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-FilePath
Указывает файл сценария для запуска в качестве фонового задания. Введите путь и имя файла скрипта. Сценарий должен находиться на локальном компьютере или в папке, к которой локальный компьютер имеет доступ.
При использовании этого параметра PowerShell преобразует содержимое указанного файла сценария в блок сценария и запускает блок сценария в качестве фонового задания.
- Тип :
String
- Позиция:
0
- Значение по умолчанию:
None
- Необходимый:
True
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-InitializationScript
Указывает команды, которые выполняются перед запуском задания. Заключите команды в фигурные скобки ({}), чтобы создать блок сценария.
Используйте этот параметр для подготовки сеанса, в котором выполняется задание. Например, вы можете использовать его для добавления в сеанс функций и модулей.
- Тип :
ScriptBlock
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-InputObject
Указывает объекты, используемые в качестве входных данных для блока сценария. Это также позволяет вводить конвейер. Используйте автоматическую переменную $input в блоке скрипта для доступа к объектам ввода.
- Тип :
PSОбъект
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
True
- Принимайте подстановочные знаки:
False
-Name
Указывает понятное имя для нового задания. Вы можете использовать имя, чтобы идентифицировать задание для других командлетов задания, таких как командлет Stop-Job.
Понятное имя по умолчанию — «Задание#», где «#» — это порядковый номер, который увеличивается для каждого задания.
- Тип :
String
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-ScriptBlock
Указывает команды для запуска в фоновом задании. Заключите команды в фигурные скобки ({}), чтобы создать блок сценария. Используйте автоматическую переменную $Input для доступа к значению параметра InputObject. Этот параметр является обязательным.
- Тип :
ScriptBlock
- Позиция:
0
- Значение по умолчанию:
None
- Необходимый:
True
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-StreamingHost
Этот параметр обеспечивает потокобезопасный способ, позволяющий передавать выходные данные Write-Host непосредственно в переданный объект PSHost. Без него вывод Write-Host поступает в поток данных о задании и не отображается в консоли хоста до тех пор, пока задания не завершатся.
- Тип :
PSHost
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-ThrottleLimit
Этот параметр ограничивает количество одновременно выполняемых заданий. При запуске задания они ставятся в очередь и ждут, пока в пуле потоков не появится поток для выполнения задания. Ограничение по умолчанию — 5 потоков.
Размер пула потоков является глобальным для сеанса PowerShell. Указание ThrottleLimit в одном вызове устанавливает ограничение для последующих вызовов в том же сеансе.
- Тип :
Int32
- Позиция:
Именованный
- Значение по умолчанию:
5
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
Входы
PSObject
Выходы
ThreadJob.ThreadJob