Поделиться через


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 возвращает все выходные данные задания.

Параметры

-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

Входные данные

PSObject

Выходные данные

ThreadJob.ThreadJob