Partager via


Start-ThreadJob

Crée des travaux en arrière-plan similaires à l’applet de commande Start-Job.

Syntaxe

ScriptBlock

Start-ThreadJob
    [-ScriptBlock] <ScriptBlock>
    [-Name <String>]
    [-InitializationScript <ScriptBlock>]
    [-InputObject <PSObject>]
    [-ArgumentList <Object[]>]
    [-ThrottleLimit <Int32>]
    [-StreamingHost <PSHost>]
    [<CommonParameters>]

FilePath

Start-ThreadJob
    [-FilePath] <String>
    [-Name <String>]
    [-InitializationScript <ScriptBlock>]
    [-InputObject <PSObject>]
    [-ArgumentList <Object[]>]
    [-ThrottleLimit <Int32>]
    [-StreamingHost <PSHost>]
    [<CommonParameters>]

Description

Start-ThreadJob crée des travaux en arrière-plan similaires à l’applet de commande Start-Job. La principale différence est que les travaux créés s’exécutent dans des threads distincts au sein du processus local. Par défaut, les travaux utilisent le répertoire de travail actuel de l’appelant qui a démarré le travail.

L’applet de commande prend également en charge un paramètre ThrottleLimit pour limiter le nombre de travaux en cours d’exécution à la fois. À mesure que d’autres travaux sont démarrés, ils sont mis en file d’attente et attendent que le nombre actuel de travaux tombe en dessous de la limite de limitation.

Exemples

Exemple 1 : Créer des travaux en arrière-plan avec une limite de thread 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;...

Exemple 2 : comparer les performances de Start-Job et de Start-ThreadJob

Cet exemple montre la différence entre Start-Job et Start-ThreadJob. Les travaux exécutent l’applet de commande Start-Sleep pendant 1 seconde. Étant donné que les travaux s’exécutent en parallèle, le temps d’exécution total est d’environ 1 seconde, ainsi que tout moment nécessaire pour créer les travaux.

# 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

Après avoir soustrait 1 seconde pour le temps d’exécution, vous pouvez voir que Start-Job prend environ 4,8 secondes pour créer cinq travaux. Start-ThreadJob est 8 fois plus rapide, prenant environ 0,6 secondes pour créer cinq travaux. Les résultats peuvent varier dans votre environnement, mais l’amélioration relative doit être la même.

Exemple 3 - Créer des travaux à l’aide d’InputObject

Dans cet exemple, le bloc de script utilise la variable $input pour recevoir l’entrée du paramètre InputObject. Cela peut également être effectué en pipant des objets pour 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

Exemple 4 - Diffuser en continu la sortie du travail vers l’hôte parent

À l’aide du paramètre StreamingHost, vous pouvez indiquer à un travail de diriger toutes les sorties de l’hôte vers un hôte spécifique. Sans ce paramètre, la sortie est envoyée à la collection de flux de données de travail et n’apparaît pas dans une console hôte tant que vous n’avez pas reçu la sortie du travail.

Pour cet exemple, l’hôte actuel est passé à Start-ThreadJob à l’aide de la variable automatique $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>

Notez que l’invite de Read-Host s’affiche et que vous pouvez taper une entrée. Ensuite, le message de Write-Warning s’affiche. L’applet de commande Receive-Job retourne toutes les sorties du travail.

Exemple 5 : Télécharger plusieurs fichiers en même temps

L’applet de commande Invoke-WebRequest ne peut télécharger qu’un seul fichier à la fois. L’exemple suivant utilise Start-ThreadJob pour créer plusieurs travaux de thread pour télécharger plusieurs fichiers en même temps.

$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
}

Paramètres

-ArgumentList

Spécifie un tableau d’arguments ou de valeurs de paramètre pour le script spécifié par les paramètres FilePath ou ScriptBlock.

ArgumentList doit être le dernier paramètre de la ligne de commande. Toutes les valeurs qui suivent le nom du paramètre sont interprétées dans la liste d’arguments.

Propriétés du paramètre

Type:

Object[]

Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-FilePath

Spécifie un fichier de script à exécuter en tant que travail en arrière-plan. Entrez le chemin d’accès et le nom de fichier du script. Le script doit se trouver sur l’ordinateur local ou dans un dossier auquel l’ordinateur local peut accéder.

Lorsque vous utilisez ce paramètre, PowerShell convertit le contenu du fichier de script spécifié en bloc de script et exécute le bloc de script en tant que travail en arrière-plan.

Propriétés du paramètre

Type:String
Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

FilePath
Position:0
Obligatoire:True
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-InitializationScript

Spécifie les commandes qui s’exécutent avant le démarrage du travail. Mettez les commandes entre accolades ({}) pour créer un bloc de script.

Utilisez ce paramètre pour préparer la session dans laquelle le travail s’exécute. Par exemple, vous pouvez l’utiliser pour ajouter des fonctions et des modules à la session.

Propriétés du paramètre

Type:ScriptBlock
Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-InputObject

Spécifie les objets utilisés comme entrée dans le bloc de script. Il permet également l’entrée de pipeline. Utilisez la variable automatique $input dans le bloc de script pour accéder aux objets d’entrée.

Propriétés du paramètre

Type:PSObject
Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:True
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-Name

Spécifie un nom convivial pour le nouveau travail. Vous pouvez utiliser le nom pour identifier le travail avec d’autres applets de commande de travaux, telles que l’applet de commande Stop-Job.

Le nom convivial par défaut est « Job# », où « # » est un nombre ordinal incrémenté pour chaque travail.

Propriétés du paramètre

Type:String
Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-ScriptBlock

Spécifie les commandes à exécuter dans le travail en arrière-plan. Mettez les commandes entre accolades ({}) pour créer un bloc de script. Utilisez la variable automatique $input pour accéder à la valeur du paramètre InputObject. Ce paramètre est obligatoire.

Propriétés du paramètre

Type:ScriptBlock
Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

ScriptBlock
Position:0
Obligatoire:True
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-StreamingHost

Ce paramètre fournit un moyen sûr de thread d’autoriser Write-Host sortie à accéder directement à l’objet passé PSHost. Sans cela, Write-Host sortie accède à la collecte de flux de données des informations de travail et n’apparaît pas dans une console hôte tant que les travaux n’ont pas terminé l’exécution.

Propriétés du paramètre

Type:PSHost
Valeur par défaut:None
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

-ThrottleLimit

Ce paramètre limite le nombre de travaux en cours d’exécution à la fois. À mesure que les travaux sont démarrés, ils sont mis en file d’attente et attendent qu’un thread soit disponible dans le pool de threads pour exécuter le travail. La limite par défaut est de 5 threads.

La taille du pool de threads est globale pour la session PowerShell. La spécification d’un ThrottleLimit dans un appel définit la limite pour les appels suivants dans la même session.

Propriétés du paramètre

Type:Int32
Valeur par défaut:5
Prend en charge les caractères génériques:False
DontShow:False

Jeux de paramètres

(All)
Position:Named
Obligatoire:False
Valeur du pipeline:False
Valeur du pipeline par nom de propriété:False
Valeur des arguments restants:False

CommonParameters

Cette applet de commande prend en charge les paramètres courants : -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction et -WarningVariable. Pour plus d’informations, consultez about_CommonParameters.

Entrées

PSObject

Sorties

ThreadJob.ThreadJob