Compartir a través de


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

PSObject

Salidas

ThreadJob.ThreadJob