Powershell-Gas-Multi-thread Arbeitsplätze durch job-Abschluss
Alle tuts die ich gefunden habe, verwenden Sie eine zuvor definierte Zeit schlafen zu Gas jobs.
Ich brauche das Gas zu warten, bis ein Auftrag abgeschlossen ist, bevor Sie beginnen eine neue.
Nur 4 Arbeitsplätze können gleichzeitig ausführen.
Damit Das Skript ausgeführt wird, bis 4, und derzeit hält für 10 Sekunden, dann läuft der rest.
Was ich will, ist für das Skript, sodass nur 4 Aufträge gleichzeitig ausführen und so ein job abgeschlossen ist, wird eine neue gestartet.
Jobs initialisiert werden, die über eine Liste von Server-Namen.
Ist es möglich, dieses Archiv?
$servers = Get-Content "C:\temp\flashfilestore\serverlist.txt"
$scriptBlock = { #DO STUFF }
$MaxThreads = 4
foreach($server in $servers) {
Start-Job -ScriptBlock $scriptBlock -argumentlist $server
While($(Get-Job -State 'Running').Count -ge $MaxThreads) {
sleep 10 #Need this to wait until a job is complete and kick off a new one.
}
}
Get-Job | Wait-Job | Receive-Job
InformationsquelleAutor Samuel Meddows | 2014-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Testen kann man die folgende :
Dieser Befehl verwendet das cmdlet Invoke-Command ausführen und seine AsJob-parameter, um einen hintergrundauftrag starten, läuft ein Skriptblock auf einer Vielzahl von Computern. Da der Befehl muss nicht ausgeführt werden, mehr als 4 mal gleichzeitig, verwendet der Befehl die ThrottleLimit-parameter von Invoke-Command verwenden, um die Anzahl der gleichzeitigen Befehle zu 4.
Vorsichtig sein, dass die Datei enthält die Namen der computer in einer Domäne.
InformationsquelleAutor JPBlanc
Um zu vermeiden, dass die Erfindung ein Rad würde ich empfehlen die Verwendung einer der
vorhandene Werkzeuge.
Einer von Ihnen ist der script
Invoke-Parallel.ps1.
Es ist geschrieben in der PowerShell können Sie sehen, wie es ist, direkt umgesetzt. Es ist
leicht zu bekommen und es erfordert keine installation für die Nutzung.
Anderes ist das Modul SplitPipeline.
Es kann schneller arbeiten, da es in C# geschrieben ist. Es deckt auch etwas mehr verwenden
Fällen, zum Beispiel langsam oder unendlich input, Nutzung der Initialisierung und cleanup-Skripts.
Im letzteren Fall ist der code mit 4 parallele pipelines
InformationsquelleAutor Roman Kuzmin
Schrieb ich einen blog-Artikel umfasst multithreading jedem Skript über aktuelle threads. Sie finden den vollständigen Beitrag hier:
http://www.get-blog.com/?p=189
Das grundlegende setup ist:
InformationsquelleAutor Ryan Witschger
Statt
sleep 10
man könnte auch einfach warten auf einen job (-any
job):Wenn es keine mehr Arbeitsplätze, kick-off, start-Druck der Ausgabe. Sie können dies auch innerhalb der Schleife unmittelbar nach dem oben genannten Befehl. Das Skript erhalten Arbeitsplätze als Sie fertig sind, anstatt zu warten, bis zum Ende.
Also dein script würde so Aussehen:
Nachdem alles gesagt, dass ich lieber runspaces (ähnlich Ryans post) oder auch workflows, wenn Sie Sie verwenden können. Diese sind weit weniger ressourcenintensiv als Ausgangspunkt mehrere powershell-Prozesse.
InformationsquelleAutor xXhRQ8sD2L7Z
Dein script sieht gut aus, versuchen Sie und fügen Sie so etwas wie
Write-Host ("current count:" + ($(Get-Job -State 'Running').Count) + " on server:" + $server)
nach deiner while-Schleife, um herauszufinden, ob der job count geht nach unten, wo man es nicht erwartet.
InformationsquelleAutor Raf
Ich bemerkt, dass jedes Start-Job-Befehl resultiert in einer zusätzlichen
conhost.exe
Prozess im task-manager. Dies zu wissen, war ich in der Lage, um Gas mit der folgenden Logik, wo5
ist meine gewünschte Anzahl gleichzeitiger threads (also ich benutze4
in meinem-gt
Aussage, da bin ich auf der Suche für eine Zählung größer als):InformationsquelleAutor Mike Langford