Start-ThreadJob
Crea trabajos en segundo plano similares al cmdlet Start-Job
.
Sintaxis
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
crea trabajos en segundo plano similares al cmdlet Start-Job
. La principal diferencia es que los trabajos que se crean se ejecutan en subprocesos independientes dentro del proceso local. De forma predeterminada, los trabajos usan el directorio de trabajo actual del autor de la llamada que inició el trabajo.
El cmdlet también admite un parámetro de ThrottleLimit para limitar el número de trabajos que se ejecutan a la vez. A medida que se inician más trabajos, se ponen en cola y esperan hasta que el número actual de trabajos cae por debajo del límite.
Ejemplos
Ejemplo 1: Creación de trabajos en segundo plano con un límite de subprocesos 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;...
Ejemplo 2: Comparación del rendimiento de Start-Job y Start-ThreadJob
En este ejemplo se muestra la diferencia entre Start-Job
y Start-ThreadJob
. Los trabajos ejecutan el cmdlet Start-Sleep
durante 1 segundo. Dado que los trabajos se ejecutan en paralelo, el tiempo total de ejecución es de aproximadamente 1 segundo, además del tiempo necesario para crear los trabajos.
# 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
Después de restar 1 segundo para el tiempo de ejecución, puede ver que Start-Job
tarda aproximadamente 4,8 segundos en crear cinco trabajos.
Start-ThreadJob
es 8 veces más rápido, tardando unos 0,6 segundos en crear cinco trabajos. Los resultados pueden variar en su entorno, pero la mejora relativa debe ser la misma.
Ejemplo 3: Creación de trabajos mediante InputObject
En este ejemplo, el bloque de script usa la variable $input
para recibir la entrada del parámetro InputObject. Esto también se puede hacer 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
Ejemplo 4: Transmisión de la salida del trabajo al host primario
Con el parámetro StreamingHost, puede indicar a un trabajo que dirija toda la salida del host a un host específico. Sin este parámetro, la salida va a la colección de flujos de datos del trabajo y no aparece en una consola host hasta que reciba la salida del trabajo.
En este ejemplo, el host actual se pasa a Start-ThreadJob
mediante la variable 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>
Observe que se muestra el mensaje de Read-Host
y puede escribir la entrada. A continuación, se muestra el mensaje de Write-Warning
. El cmdlet Receive-Job
devuelve toda la salida del trabajo.
Ejemplo 5: Descarga de varios archivos al mismo tiempo
El cmdlet Invoke-WebRequest
solo puede descargar un archivo cada vez. En el ejemplo siguiente se usa Start-ThreadJob
para crear varios trabajos de subproceso para descargar varios archivos al mismo tiempo.
$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 una matriz de argumentos o valores de parámetro para el script especificado por los parámetros FilePath o ScriptBlock.
argumentList debe ser el último parámetro de la línea de comandos. Todos los valores que siguen el nombre del parámetro se interpretan en la lista de argumentos.
Tipo: | Object[] |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-FilePath
Especifica un archivo de script que se va a ejecutar como un trabajo en segundo plano. Escriba la ruta de acceso y el nombre de archivo del script. El script debe estar en el equipo local o en una carpeta a la que pueda acceder el equipo local.
Cuando se usa este parámetro, PowerShell convierte el contenido del archivo de script especificado en un bloque de script y ejecuta el bloque de script como un trabajo en segundo plano.
Tipo: | String |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-InitializationScript
Especifica los comandos que se ejecutan antes de que se inicie el trabajo. Incluya los comandos entre llaves ({}
) para crear un bloque de script.
Use este parámetro para preparar la sesión en la que se ejecuta el trabajo. Por ejemplo, puede usarlo para agregar funciones y módulos a la sesión.
Tipo: | ScriptBlock |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-InputObject
Especifica los objetos usados como entrada para el bloque de script. También permite la entrada de canalización. Use el $input
variable automática en el bloque de script para acceder a los objetos de entrada.
Tipo: | PSObject |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
-Name
Especifica un nombre descriptivo para el nuevo trabajo. Puede usar el nombre para identificar el trabajo con otros cmdlets de trabajo, como el cmdlet Stop-Job
.
El nombre descriptivo predeterminado es "Job#", donde "#" es un número ordinal que se incrementa para cada trabajo.
Tipo: | String |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ScriptBlock
Especifica los comandos que se van a ejecutar en el trabajo en segundo plano. Incluya los comandos entre llaves ({}
) para crear un bloque de script. Use la variable automática $Input
para tener acceso al valor del parámetro InputObject de. Este parámetro es obligatorio.
Tipo: | ScriptBlock |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-StreamingHost
Este parámetro proporciona una forma segura de subprocesos para permitir que Write-Host
salida vaya directamente al objeto de PSHost. Sin ella, Write-Host
salida va a la recopilación de flujos de datos de información del trabajo y no aparece en una consola host hasta que los trabajos terminen de ejecutarse.
Tipo: | PSHost |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ThrottleLimit
Este parámetro limita el número de trabajos que se ejecutan a la vez. A medida que se inician los trabajos, se ponen en cola y esperan hasta que un subproceso esté disponible en el grupo de subprocesos para ejecutar el trabajo. El límite predeterminado es 5 subprocesos.
El tamaño del grupo de subprocesos es global para la sesión de PowerShell. Al especificar un throttleLimit en una llamada, se establece el límite de llamadas posteriores en la misma sesión.
Tipo: | Int32 |
Posición: | Named |
Valor predeterminado: | 5 |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
Entradas
Salidas
ThreadJob.ThreadJob