Compartir a través de


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

PSObject

Salidas

ThreadJob.ThreadJob