Comment est-threading dans powershell travail?
Je veux paralléliser certaines d'analyse de fichier actions avec l'activité du réseau dans powershell. Rapide de google, pour elle,
start-fil ressemblait à une solution, mais:
Le terme de "start-thread' n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou d'un programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin d'accès a été inclus, vérifiez que le chemin d'accès est correct et essayez à nouveau.
Arrivé la même chose quand j'ai essayé de début d'emploi.
J'ai aussi essayé de bidouiller avec Système.Le filetage.Fil
[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 la v2.0 et je n'ai pas besoin de compatibilité descendante.
- tl;dr:
receive-job (wait-job ($a = start-job { "heyo!" })); remove-job $a
ou$a = start-job { "heyo!" }; wait-job $a; receive-job $a; remove-job $a
Notez également que si vous appelezreceive-job
avant que le travail est terminé, vous pouvez obtenir rien du tout. - Aussi
(get-job $a).jobstateinfo.state;
Vous devez vous connecter pour publier un commentaire.
Powershell ne dispose pas d'une commande intégrée nommée Start-Fil.
V2.0 ne, cependant, ont PowerShell emplois, qui peut s'exécuter en arrière-plan, et peut être considéré comme l'équivalent d'un thread. Vous avez les commandes suivantes à votre disposition pour travailler avec des travaux:
Voici un exemple sur la façon de travailler avec elle. Pour commencer une tâche, utilisez de début d'emploi, et de passer un bloc de script qui contient le code que vous voulez exécuter de manière asynchrone:
Cette commande permet de démarrer un travail, qui obtient tous les enfants dans le répertoire courant de manière récursive, et vous serez renvoyé à la ligne de commande immédiatement.
Vous pouvez examiner les
$job
variable pour voir si le travail est terminé, etc. Si vous voulez attendre pour un emploi à la fin, utilisez:Enfin, pour recevoir les résultats d'un emploi, d'utiliser:
Vous ne pouvez pas utiliser directement des threads comme cela, mais vous ne pouvez pas être blâmés pour essayer car une fois l'ensemble de la BCL est située en face de vous, il n'est pas totalement idiot d'espérer que la plupart de ce travail 🙂
PowerShell s'exécute scriptblocks dans les canalisations qui requièrent à leur tour des espaces d'exécution pour les exécuter. J'ai blogué sur la façon de rouler vos propres MT scripts il y a quelques temps pour la v2 ctp3, mais la technique (et de l'API) est toujours le même. Les principaux outils sont la
[runspacefactory]
et[powershell]
types. Jetez un oeil ici:http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx
Ci-dessus est la plus légère façon d'aborder MT de script. Il est l'arrière-plan de soutien à l'emploi dans la v2 par la voie de la start-job, get-job, mais j'ai pensé vous déjà repéré qu'il a vu et qu'ils sont assez lourds.
J'ai un article de blog sur comment vous pouvez multithread tout script powershell.
Le Multithreading avec des Emplois en PowerShell
Profitez-en!
Il y a un article sur les travaux de fond dans powershell sur MSDN à l' http://msdn.microsoft.com/en-us/library/dd878288(SV.85).aspx.
Vous pouvez également lire les emplois en powershell lui-même.