Поиск по сайту:

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