Compartilhar via


Start-ThreadJob

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

Sintaxe

Start-ThreadJob
     [-ScriptBlock] <ScriptBlock>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [<CommonParameters>]
Start-ThreadJob
     [-FilePath] <String>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [<CommonParameters>]

Description

Start-ThreadJob cria trabalhos em segundo plano semelhantes ao cmdlet Start-Job. 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 dá 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 esperam até que o número atual de trabalhos caia abaixo do limite de limitaçã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 cmdlet Start-Sleep por 1 segundo. Como os trabalhos são executados em paralelo, o tempo total de execução é de cerca de 1 segundo, mais o 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 trabalhos. 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 variável $input para receber a entrada do parâmetro InputObject. Isso também pode ser feito canalizando objetos para 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

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.

Tipo:Object[]
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga: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.

Tipo:String
Cargo:0
Valor padrão:None
Obrigatório:True
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-InitializationScript

Especifica os comandos executados antes do início do trabalho. Coloque os comandos em 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.

Tipo:ScriptBlock
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-InputObject

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

Tipo:PSObject
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga: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 cmdlet Stop-Job.

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

Tipo:String
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-ScriptBlock

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

Tipo:ScriptBlock
Cargo:0
Valor padrão:None
Obrigatório:True
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga: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 esperam até que um thread esteja disponível no pool de threads para executar o trabalho. O limite padrão é 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.

Tipo:Int32
Cargo:Named
Valor padrão:5
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

Entradas

PSObject

Saídas

ThreadJob.ThreadJob