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.
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
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.
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!
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