Как работает threading в powershell?
Я хочу распараллелить некоторые действия по анализу файлов с сетевой активностью в powershell. Быстрый Google для этого,
start-thread выглядела как решение, но:
Термин "start-thread" не распознается как имя командлета, функции, файла script или исполняемой программы. Проверьте правильность написания имени или если путь был включен, проверьте правильность пути и повторите попытку.
То же самое произошло, когда я попытался запустить работу.
Я также пытался возиться с 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()
Итак, я думаю, что лучше всего было бы знать, что я делаю неправильно, когда использую start-thread, потому что это работает для других людей. Я использую v2.0, и мне не нужна нисходящая совместимость.
Ответы
Ответ 1
Powershell не имеет встроенной команды Start-Thread.
V2.0, однако, имеет задания PowerShell, которые могут выполняться в фоновом режиме и могут считаться эквивалентом потока. У вас есть следующие команды для работы с заданиями:
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.
Вот пример того, как работать с ним. Чтобы запустить задание, используйте start-job и передайте блок script, который содержит код, который вы хотите запустить асинхронно:
$job = start-job { get-childitem . -recurse }
Эта команда запустит задание, которое будет рекурсивно возвращать все дети в текущем каталоге, и вы сразу же вернетесь в командную строку.
Вы можете просмотреть переменную $job
, чтобы узнать, закончилось ли задание и т.д. Если вы хотите дождаться окончания задания, используйте:
wait-job $job
Наконец, чтобы получить результаты задания, используйте:
receive-job $job
Ответ 2
Вы не можете использовать потоки напрямую, как это, но вы не можете быть обвинены в попытке попробовать, так как вся BCL лежит перед вами, не совсем глупо ожидать, что большинство из них будет работать:)
PowerShell запускает сценарии в конвейерах, которые, в свою очередь, требуют выполнения пробелов для их выполнения. Я писал о том, как немного свернуть собственные скрипты MT для v2 ctp3, но техника (и API) по-прежнему остается прежней. Основными инструментами являются типы [runspacefactory]
и [powershell]
. Посмотрите здесь:
http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx
Вышеупомянутый способ - самый легкий способ приблизиться к скриптам MT. Есть поддержка фоновой работы в v2 с помощью функции start-job, get-job, но я решил, что вы уже заметили это и увидели, что они довольно тяжеловесные.
Ответ 3
У меня есть статья в блоге о том, как вы можете многопоточать любую данную powershell script.
http://ryan.witschger.net/?p=22
Наслаждайтесь!
Ответ 4
Существует статья о фоновых заданиях в PowerShell на MSDN по адресу http://msdn.microsoft.com/en-us/library/dd878288(VS.85).aspx.
Вы также можете прочитать о работе в самой PowerShell.
> help about_Jobs