Start-ThreadJob
Crea trabajos en segundo plano similares al Start-Job
cmdlet .
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 Start-Job
cmdlet . 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 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 e Start-ThreadJob
En este ejemplo se muestra la diferencia entre Start-Job
y Start-ThreadJob
. Los trabajos ejecutan el Start-Sleep
cmdlet 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 unos 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 $input
variable para recibir la entrada del parámetro InputObject . Esto también se puede hacer canalizando objetos a 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 al Start-ThreadJob
uso de la $Host
variable 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 se muestra la solicitud de Read-Host
y puede escribir la entrada. A continuación, se muestra el mensaje de Write-Warning
. El Receive-Job
cmdlet devuelve toda la salida del trabajo.
Ejemplo 5: Descarga de varios archivos al mismo tiempo
El Invoke-WebRequest
cmdlet solo puede descargar un archivo a la 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 la $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 Stop-Job
cmdlet .
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 ejecutarán en el trabajo en segundo plano. Incluya los comandos entre llaves ({}
) para crear un bloque de script. Use la $Input
variable automática para acceder al valor del parámetro InputObject . 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 manera segura de subprocesos para permitir que Write-Host
la salida vaya directamente al objeto PSHost pasado. Sin ella, Write-Host
la 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 LímiteLimit en una llamada, se establece el límite para las 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