Comment fonctionne le threading dans powershell?

je veux mettre en parallèle certaines actions de parsing de fichiers avec l'activité réseau dans powershell. Google rapide pour lui, le fil de départ ressemblait à une solution, mais:

le terme 'start-thread' n'est pas reconnu comme le nom d'un cmdlet, d'une fonction, d'un fichier script ou d'un programme opérable. Vérifiez l'orthographe du nom, ou si un chemin a été inclus, vérifiez que le chemin est correct et réessayez.

la même chose s'est produite quand j'ai essayé start-job.

je aussi essayé de bidouiller avec Système.Le filetage.Thread

[System.Reflection.Assembly]::LoadWithPartialName("System.Threading")
#This next errors, something about the arguments I can't figure out from the documentation of .NET
$tstart = new-object System.Threading.ThreadStart({DoSomething}) 
$thread = new-object System.Threading.Thread($tstart) 
$thread.Start()

Donc, je pense que le mieux serait de savoir ce que je fais mal quand j'utilise start-thread, car il semble fonctionner pour d'autres personnes. J'utilise du v2.0 et je n'ai pas besoin de compatibilité descendante.

24
demandé sur Caesar 2010-07-24 20:37:19

4 réponses

Powershell n'a pas de commande intégrée nommée Start-Thread.

V2.0 a cependant des travaux PowerShell, qui peuvent fonctionner en arrière-plan, et peuvent être considérés comme l'équivalent d'un thread. Vous disposez des commandes suivantes pour travailler avec des jobs:

Name                              Category  Synopsis
----                              --------  --------
Start-Job                         Cmdlet    Starts a Windows PowerShell background job.
Get-Job                           Cmdlet    Gets Windows PowerShell background jobs that are running in the current ...
Receive-Job                       Cmdlet    Gets the results of the Windows PowerShell background jobs in the curren...
Stop-Job                          Cmdlet    Stops a Windows PowerShell background job.
Wait-Job                          Cmdlet    Suppresses the command prompt until one or all of the Windows PowerShell...
Remove-Job                        Cmdlet    Deletes a Windows PowerShell background job.

Voici un exemple sur la façon de travailler avec elle. Pour démarrer une tâche, utilisez start-job et passez un bloc script qui contient le code que vous voulez exécuter asynchrone:

$job  = start-job { get-childitem . -recurse }

ce la commande lancera un travail, qui mettra tous les enfants dans le répertoire courant de façon récursive, et vous serez immédiatement retournés à la ligne de commande.

vous pouvez examiner le $job variable pour voir si le travail est terminé, etc. Si vous voulez attendre la fin d'un travail, utilisez:

wait-job $job

Enfin, pour recevoir les résultats d'un emploi, d'utiliser:

receive-job $job
29
répondu driis 2010-07-24 16:50:30

vous ne pouvez pas utiliser des threads directement comme ça, mais vous ne pouvez pas être blâmé d'essayer car une fois que toute la BCL se trouve devant vous, ce n'est pas complètement stupide de s'attendre à ce que la plupart de cela fonctionne :)

PowerShell exécute des scriptblocks dans des pipelines qui, à leur tour, nécessitent des espaces d'exécution pour les exécuter. J'ai blogué sur la façon de lancer vos propres scripts MT il y a quelque temps pour V2 ctp3, mais la technique (et L'API) est toujours la même. Les principaux outils sont le [runspacefactory] et [powershell] types. Prendre un coup d'oeil ici:

http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx

ce qui précède est la façon la plus légère d'aborder les scripts MT. Il y a un support de travail de fond dans v2 par le biais de start-job, get-job, mais j'ai pensé que vous aviez déjà remarqué cela et vu qu'ils sont assez lourds.

8
répondu x0n 2010-07-24 16:47:40

j'ai un article de blog sur la façon dont vous pouvez multithread n'importe quel script powershell donné.

Multithreading avec des Emplois dans PowerShell

Profitez-en!

3
répondu Ryan Witschger 2018-05-07 03:44:16

Il y a un article sur les travaux de fond dans powershell sur MSDN à http://msdn.microsoft.com/en-us/library/dd878288 (VS.85).aspx.

Vous pouvez également lire sur les emplois dans powershell lui-même.

> help about_Jobs
2
répondu Eric Weilnau 2010-07-24 16:52:09