Share via


Start-ThreadJob

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

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 crée des travaux en arrière-plan similaires à l’applet de Start-Job commande. La main différence est que les travaux qui sont 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 passe en dessous de la limite de limitation.

Exemples

Exemple 1 : Create travaux en arrière-plan avec une limite de threads 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 Start-Sleep de commande 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, plus le temps nécessaire à la création des 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 cela Start-Job prend environ 4,8 secondes pour créer cinq travaux. Start-ThreadJob est 8 fois plus rapide, ce qui prend environ 0,6 seconde 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 - Create travaux à l’aide d’InputObject

Dans cet exemple, le bloc de script utilise la $input variable pour recevoir l’entrée du paramètre InputObject . Pour ce faire, vous pouvez également acheminer des objets vers 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 - Stream sortie du travail sur l’hôte parent

À l’aide du paramètre StreamingHost , vous pouvez indiquer à un travail de diriger toute la sortie de l’hôte vers un hôte spécifique. Sans ce paramètre, la sortie va à 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é à l’aide Start-ThreadJob de la $Host variable automatique.

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 Receive-Job de commande retourne toute la sortie du travail.

Paramètres

-ArgumentList

Spécifie un tableau d’arguments, ou des 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 des valeurs interprétées dans la liste d’arguments.

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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.

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InitializationScript

Spécifie les commandes à exécuter avant le début de la tâche. Enfermez les commandes dans des accolades ({}) pour créer un bloc de script.

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

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters: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 $input variable automatique dans le bloc de script pour accéder aux objets d’entrée.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-Name

Spécifie le nom convivial de la nouvelle tâche. Vous pouvez utiliser le nom pour identifier le travail à d’autres applets de commande de travail, telles que l’applet de Stop-Job commande.

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

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

Spécifie les commandes à exécuter dans la tâche en arrière-plan. Enfermez les commandes dans des accolades ({}) pour créer un bloc de script. Utilisez la $Input variable automatique pour accéder à la valeur du paramètre InputObject . Ce paramètre est obligatoire.

Type:ScriptBlock
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-StreamingHost

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

Type:PSHost
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ThrottleLimit

Ce paramètre limite le nombre de travaux en cours d’exécution à la fois. Lorsque 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’une limite de limitation dans un appel définit la limite pour les appels suivants dans la même session.

Type:Int32
Position:Named
Default value:5
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Entrées

PSObject

Sorties

ThreadJob.ThreadJob