2010-07-24 16 views
23

Ich möchte einige Datei-Parsing-Aktionen mit Netzwerkaktivität in Powershell parallelisieren. Schneller Google für sie, Start-Faden wie eine Lösung gesucht, aber:Wie funktioniert das Threading in der Powershell?

Der Begriff ‚Start-Thread‘ nicht als Name eines Cmdlets, Funktion, Skriptdatei oder ein geschriebenes Programm erkannt. Überprüfen Sie die Schreibweise des Namens, oder überprüfen Sie, ob der Pfad korrekt ist, und versuchen Sie es erneut.

Das gleiche passierte, als ich Start-Job versuchte.

Ich habe auch versucht also mit System.Threading.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() 

Hantieren, ich denke, das Beste wäre zu wissen, was ich falsch gemacht, wenn ich Start-Thread verwenden, da es auch für andere Menschen zu arbeiten scheint. Ich benutze v2.0 und brauche keine Abwärtskompatibilität.

+0

** tl; dr: ** 'empfange-job (wait-job ($ a = start-job {" heyo! "})); remove-job $ a' oder '$ a = start-job {" heyo! " }; Warte-Job $ a; Empfangsarbeit $ a; remove-job $ a' Beachten Sie auch, dass Sie, wenn Sie vor dem Job "receive-job" aufrufen, gar nichts erhalten. – Andrew

+0

Auch '(get-job $ a) .jobstatinfo.state;' – Andrew

Antwort

28

Powershell hat keinen integrierten Befehl namens Start-Thread.

V2.0 hat jedoch PowerShell-Jobs, die im Hintergrund ausgeführt werden können und als äquivalent zu einem Thread angesehen werden können. Ihnen stehen folgende Befehle zum Arbeiten mit Jobs zur Verfügung:

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. 

Hier ein Beispiel, wie Sie damit arbeiten können. Um einen Job zu starten, verwendungs ​​Job starten und einen Skriptblock übergeben, die den Code enthält, die Sie ausführen möchten asynchron:

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

Dieser Befehl wird einen Job starten, die alle Kinder unter dem aktuellen Verzeichnis wird rekursiv, und Sie werden sofort zur Befehlszeile zurückkehren.

Sie können die $job Variable untersuchen, ob der Job sehen beendet ist, etc. Wenn Sie für einen Job warten wollen zu beenden, verwenden Sie:

wait-job $job 

schließlich die Ergebnisse von einem Job zu erhalten, Verwendung:

receive-job $job 
+4

Start-Job startet eigentlich eine neue Powershell-Sitzung und es ist schwer. Es wird kein Thread gestartet. – ca9163d9

+0

Start-Job erfasst keinen Umgebungsstatus, keine Locals, Funktionen oder Modulimporte, hat einen enormen Overhead und ist eine typische PowerShell-API. Es wäre sehr hilfreich, wenn .NET TPL mit einigen Dispatching to PS Runspace-Strategie verwendet werden könnte –

8

Sie können Threads nicht direkt verwenden, wie dieses, aber man kann nicht da einmal verantwortlich gemacht werden für den Versuch, die ganze BCL wird vor Ihnen liegen, es ist nicht ganz dumm die meisten davon zu erwarten zu arbeiten :)

PowerShell führt Skriptblöcke in Pipelines aus, die wiederum Runspaces erfordern, um sie auszuführen. Ich habe vor einiger Zeit darüber gebloggt, wie man eigene MT-Skripte für v2 ctp3 dreht, aber die Technik (und API) ist immer noch dieselbe. Die Hauptwerkzeuge sind die Typen [runspacefactory] und [powershell]. Werfen Sie einen Blick hier:

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

Die oben der leichteste Weg ist MT-Scripting zu nähern. Es gibt Hintergrund-Job-Unterstützung in v2 durch Start-Job, Get-Job, aber ich dachte, Sie haben das schon entdeckt und gesehen, dass sie ziemlich schwer sind.

4

Ich habe einen Blog-Artikel darüber, wie Sie ein beliebiges Powershell-Skript Multithread.

http://ryan.witschger.net/?p=22

Viel Spaß!

+0

Dieses Skript ist fantastisch! Vielen Dank für die Veröffentlichung. – Sune

+6

Dieser Artikel ist nicht mehr verfügbar. –

+3

https://web.archive.org/web/20130127083728/http://ryan.witschger.net/?p=22 – Mick

Verwandte Themen