Start-ThreadJob
Cria trabalhos em segundo plano semelhantes ao cmdlet Start-Job.
Sintaxe
ScriptBlock
Start-ThreadJob
[-ScriptBlock] <ScriptBlock>
[-Name <String>]
[-InitializationScript <ScriptBlock>]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-ThrottleLimit <Int32>]
[-StreamingHost <PSHost>]
[<CommonParameters>]
FilePath
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 cmdlet Start-Job. A principal diferença é que os trabalhos que são 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 tarefas 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 do Start-Job e do Start-ThreadJob
Este exemplo mostra a diferença entre Start-Job e Start-ThreadJob. Os trabalhos executam o cmdlet Start-Sleep durante 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 no 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 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
Exemplo 4 - Transmitir saída de trabalho para o host pai
Usando o parâmetro StreamingHost, pode indicar a um trabalho que direcione toda a saída para um host específico. Sem esse parâmetro, a saída vai para a coleção de fluxo de dados do trabalho e não aparece numa consola anfitriã até que recebas a saída do trabalho.
Neste exemplo, o host atual é passado para Start-ThreadJob usando a variável automática $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>
Repare que o prompt do Read-Host é exibido e que podes introduzir dados. Em seguida, a mensagem de Write-Warning é exibida. O cmdlet Receive-Job retorna toda a saída do trabalho.
Exemplo 5 - Baixar vários arquivos ao mesmo tempo
O cmdlet Invoke-WebRequest só pode baixar um arquivo de cada 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.
Propriedades dos parâmetros
| Tipo: | Object[] |
| Default value: | None |
| Suporta carateres universais: | False |
| NãoMostrar: | False |
Conjuntos de parâmetros
(All)
| Position: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline por nome de propriedade: | False |
| Valor dos restantes argumentos: | 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.
Propriedades dos parâmetros
| Tipo: | String |
| Default value: | None |
| Suporta carateres universais: | False |
| NãoMostrar: | False |
Conjuntos de parâmetros
FilePath
| Position: | 0 |
| Obrigatório: | True |
| Valor do pipeline: | False |
| Valor do pipeline por nome de propriedade: | False |
| Valor dos restantes argumentos: | False |
-InitializationScript
Especifica comandos que são executados antes do início do trabalho. Coloque os comandos entre chaves ({}) para criar um bloco de script.
Use este 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.
Propriedades dos parâmetros
| Tipo: | ScriptBlock |
| Default value: | None |
| Suporta carateres universais: | False |
| NãoMostrar: | False |
Conjuntos de parâmetros
(All)
| Position: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline por nome de propriedade: | False |
| Valor dos restantes argumentos: | False |
-InputObject
Especifica os objetos usados como entrada para o bloco de script. Também permite entrada através de pipeline. Use a variável automática $input no bloco de script para acessar os objetos de entrada.
Propriedades dos parâmetros
| Tipo: | PSObject |
| Default value: | None |
| Suporta carateres universais: | False |
| NãoMostrar: | False |
Conjuntos de parâmetros
(All)
| Position: | Named |
| Obrigatório: | False |
| Valor do pipeline: | True |
| Valor do pipeline por nome de propriedade: | False |
| Valor dos restantes argumentos: | False |
-Name
Especifica um nome amigável para o novo trabalho. Você pode usar o nome para identificar a tarefa a outros cmdlets de tarefa, como o cmdlet Stop-Job.
O nome amigável padrão é "Job#", onde "#" é um número ordinal que é incrementado para cada trabalho.
Propriedades dos parâmetros
| Tipo: | String |
| Default value: | None |
| Suporta carateres universais: | False |
| NãoMostrar: | False |
Conjuntos de parâmetros
(All)
| Position: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline por nome de propriedade: | False |
| Valor dos restantes argumentos: | False |
-ScriptBlock
Especifica os comandos a serem executados no trabalho em segundo plano. Coloque os comandos entre chaves ({}) para criar um bloco de script. Use a variável automática $input para aceder ao valor do parâmetro InputObject. Este parâmetro é obrigatório.
Propriedades dos parâmetros
| Tipo: | ScriptBlock |
| Default value: | None |
| Suporta carateres universais: | False |
| NãoMostrar: | False |
Conjuntos de parâmetros
ScriptBlock
| Position: | 0 |
| Obrigatório: | True |
| Valor do pipeline: | False |
| Valor do pipeline por nome de propriedade: | False |
| Valor dos restantes argumentos: | False |
-StreamingHost
Este parâmetro fornece uma maneira segura para threads para permitir que Write-Host saída vá diretamente para o objeto passado em PSHost. Sem ele, a saída Write-Host vai para o fluxo de dados de informações de tarefas e não aparece em um console anfitrião até que as tarefas terminem de ser executadas.
Propriedades dos parâmetros
| Tipo: | PSHost |
| Default value: | None |
| Suporta carateres universais: | False |
| NãoMostrar: | False |
Conjuntos de parâmetros
(All)
| Position: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline por nome de propriedade: | False |
| Valor dos restantes argumentos: | False |
-ThrottleLimit
Este 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. Ao especificar um ThrottleLimit num único comando, define-se o limite para chamadas subsequentes na mesma sessão.
Propriedades dos parâmetros
| Tipo: | Int32 |
| Default value: | 5 |
| Suporta carateres universais: | False |
| NãoMostrar: | False |
Conjuntos de parâmetros
(All)
| Position: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline por nome de propriedade: | False |
| Valor dos restantes argumentos: | False |
CommonParameters
Este cmdlet suporta os parâmetros comuns: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction e -WarningVariable. Para obter mais informações, consulte about_CommonParameters.