Start-ThreadJob
Crea trabajos en segundo plano similares al 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
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 caiga por debajo del límite.
Ejemplos
Ejemplo 1: Create 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 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 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: Create 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 mediante la canalización de 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: Stream salida del trabajo en el 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 $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: Descargar varios archivos al mismo tiempo
El Invoke-WebRequest
cmdlet 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 al nombre del parámetro se interpretan en la lista de argumentos.
Type: | Object[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | 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 scripts como un trabajo en segundo plano.
Type: | String |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | 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.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | 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.
Type: | PSObject |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-Name
Especifica un nombre descriptivo para el nuevo trabajo. Puede usar el nombre para identificar el trabajo en 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.
Type: | String |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | 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 tener acceso al valor del parámetro InputObject . Este parámetro es obligatorio.
Type: | ScriptBlock |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | 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 colección de flujos de datos de información del trabajo y no aparece en una consola host hasta que los trabajos terminen de ejecutarse.
Type: | PSHost |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | 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 de llamadas posteriores en la misma sesión.
Type: | Int32 |
Position: | Named |
Default value: | 5 |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Entradas
Salidas
ThreadJob.ThreadJob