Start-ThreadJob

Cria trabalhos em segundo plano semelhantes ao Start-Job cmdlet.

Syntax

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>]

Description

Start-ThreadJob Cria trabalhos em segundo plano semelhantes ao Start-Job cmdlet. A principal diferença é que os trabalhos criados são executados em threads separados dentro do processo local. Por padrão, os trabalhos usam o diretório de trabalho atual do chamador que iniciou o trabalho.

O cmdlet também oferece suporte a um parâmetro ThrottleLimit para limitar o número de trabalhos em execução ao mesmo tempo. À medida que mais trabalhos são iniciados, eles são enfileirados e aguardam até que o número atual de trabalhos caia abaixo do limite de aceleração.

Exemplos

Exemplo 1 - Criar trabalhos em segundo plano com um limite de thread de 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;...

Exemplo 2 - Comparar o desempenho de Start-Job e Start-ThreadJob

Este exemplo mostra a diferença entre Start-Job e Start-ThreadJob. Os trabalhos executam o Start-Sleep cmdlet por 1 segundo. Como os trabalhos são executados em paralelo, o tempo total de execução é de cerca de 1 segundo, mais qualquer tempo necessário para criar os trabalhos.

# 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

Depois de subtrair 1 segundo para o tempo de execução, você pode ver que Start-Job leva cerca de 4,8 segundos para criar cinco trabalhos. Start-ThreadJob é 8 vezes mais rápido, levando cerca de 0,6 segundos para criar cinco empregos. Os resultados podem variar em seu ambiente, mas a melhoria relativa deve ser a mesma.

Exemplo 3 - Criar trabalhos usando InputObject

Neste exemplo, o bloco de script usa a $input variável para receber entrada do parâmetro InputObject . Isso também pode ser feito canalizando objetos para Start-ThreadJobo .

$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

Exemplo 4 - Transmitir a saída do trabalho para o host pai

Usando o parâmetro StreamingHost, você pode dizer a um trabalho para direcionar toda a saída do host para um host específico. Sem esse parâmetro, a saída vai para a coleta de fluxo de dados do trabalho e não aparece em um console do host até que você receba a saída do trabalho.

Para este exemplo, o host atual é passado para Start-ThreadJob o uso da $Host variável automática.

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>

Observe que o prompt de Read-Host é exibido e você pode digitar entrada. Em seguida, a mensagem de Write-Warning é exibida. O Receive-Job cmdlet retorna toda a saída do trabalho.

Exemplo 5 - Baixar vários arquivos ao mesmo tempo

O Invoke-WebRequest cmdlet só pode baixar um arquivo por vez. O exemplo a seguir usa Start-ThreadJob para criar vários trabalhos de thread para baixar vários arquivos ao mesmo tempo.

$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
}

Parâmetros

-ArgumentList

Especifica uma matriz de argumentos, ou valores de parâmetro, para o script especificado pelos parâmetros FilePath ou ScriptBlock .

ArgumentList deve ser o último parâmetro na linha de comando. Todos os valores que seguem o nome do parâmetro são valores interpretados na lista de argumentos.

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilePath

Especifica um arquivo de script a ser executado como um trabalho em segundo plano. Insira o caminho e o nome do arquivo do script. O script deve estar no computador local ou em uma pasta que o computador local possa acessar.

Quando você usa esse parâmetro, o PowerShell converte o conteúdo do arquivo de script especificado em um bloco de script e executa o bloco de script como um trabalho em segundo plano.

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InitializationScript

Especifica os comandos que são executados antes do trabalho ser iniciado. Coloque os comandos entre chaves ({}) para criar um bloco de script.

Use esse parâmetro para preparar a sessão na qual o trabalho é executado. Por exemplo, você pode usá-lo para adicionar funções e módulos à sessão.

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Especifica os objetos usados como entrada para o bloco de script. Ele também permite a entrada de tubulação. Use a $input variável automática no bloco de script para acessar os objetos de entrada.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-Name

Especifica um nome amigável para o novo trabalho. Você pode usar o nome para identificar o trabalho para outros cmdlets de trabalho, como o Stop-Job cmdlet.

O nome amigável padrão é "Job#", onde "#" é um número ordinal que é incrementado para cada trabalho.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

Especifica os comandos a executar no trabalho em segundo plano. Coloque os comandos entre chaves ({}) para criar um bloco de script. Use a $Input variável automática para acessar o valor do parâmetro InputObject . Este parâmetro é obrigatório.

Type:ScriptBlock
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-StreamingHost

Esse parâmetro fornece uma maneira segura de thread para permitir que Write-Host a saída vá diretamente para o objeto PSHost passado. Sem ele, Write-Host a saída vai para a coleta de fluxo de dados de informações de trabalho e não aparece em um console host até que os trabalhos terminem de ser executados.

Type:PSHost
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ThrottleLimit

Esse parâmetro limita o número de trabalhos em execução ao mesmo tempo. À medida que os trabalhos são iniciados, eles são enfileirados e aguardam até que um thread esteja disponível no pool de threads para executar o trabalho. O limite padrão é de 5 threads.

O tamanho do pool de threads é global para a sessão do PowerShell. Especificar um ThrottleLimit em uma chamada define o limite para chamadas subsequentes na mesma sessão.

Type:Int32
Position:Named
Default value:5
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Entradas

PSObject

Saídas

ThreadJob.ThreadJob