Как работает многопоточность в powershell? - PullRequest
25 голосов
/ 24 июля 2010

Я хочу распараллелить некоторые действия по анализу файлов с сетевой активностью в powershell.Быстрый поиск в Google, start-thread выглядел как решение, но:

Термин «start-thread» не распознается как имя командлета, функции, файла сценария или работоспособной программы.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

То же самое произошло, когда я попробовал start-job.

Я также попытался поиграться с 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 и мне не нужна нисходящая совместимость.

Ответы [ 4 ]

31 голосов
/ 24 июля 2010

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 и передайте блок скрипта, который содержит код, который вы хотите запустить асинхронно:

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

Эта команда запускает задание, которое рекурсивно возвращает всех дочерних элементов в текущий каталог, и вы немедленно возвращаетесь в командную строку.

Вы можете проверить переменную $job, чтобы увидеть, завершилось ли задание и т. Д. Если вы хотите дождаться окончания задания, используйте:

wait-job $job

Наконец, чтобы получить результаты работы, используйте:

receive-job $job
10 голосов
/ 24 июля 2010

Вы не можете использовать потоки напрямую, как это, но вы не можете быть обвинены в том, что пытаетесь, поскольку, как только весь BCL лежит перед вами, не совсем глупо ожидать, что большая часть его будет работать :)1002 * PowerShell запускает блоки сценариев в конвейерах, которым, в свою очередь, требуются пространства выполнения для их выполнения.Я писал в блоге о том, как накатить ваши собственные MT-скрипты некоторое время назад для v2 ctp3, но техника (и API) все та же.Основными инструментами являются типы [runspacefactory] и [powershell].Взгляните сюда:

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

Выше приведен самый легкий способ приблизиться к MT-скриптингу.В v2 есть поддержка фоновой работы в виде начала работы, получения работы, но я подумал, что вы уже заметили это и увидели, что они довольно тяжелые.

4 голосов
/ 06 января 2011

У меня есть статья в блоге о том, как вы можете использовать многопоточность любого данного сценария powershell.

Многопоточность с заданиями в PowerShell

Наслаждайтесь!

3 голосов
/ 24 июля 2010

На MSDN есть статья о фоновых заданиях в powershell на http://msdn.microsoft.com/en-us/library/dd878288(VS.85).aspx.

Также можно прочитать о заданиях в самом powershell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...