2010-07-24 5 views
23

Quiero paralelizar algunas acciones de análisis de archivos con actividad de red en powershell. Google rápida para ello, puesta en hilo parecía una solución, pero:¿Cómo funciona el enhebrado en Powershell?

El término 'puesta en hilo' no se reconoce como el nombre de un cmdlet, función, archivo de script o programa ejecutable. Verifique la ortografía del nombre, o si se incluyó una ruta, verifique que la ruta sea correcta y vuelva a intentarlo.

Lo mismo sucedió cuando probé el trabajo inicial.

También probé perder el tiempo con 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() 

Por lo tanto, creo que lo mejor sería saber lo que hago mal cuando utilizo la puesta en hilo, ya que parece que funciona para otras personas. Yo uso v2.0 y no necesito compatibilidad hacia abajo.

+0

** tl; dr: ** 'receive-job (wait-job ($ a = start-job {" heyo! "})); remove-job $ a' o '$ a = start-job {" heyo! " }; wait-job $ a; recibir-trabajo $ a; remove-job $ a' También tenga en cuenta que si llama a 'receive-job' antes de que el trabajo finalice, es posible que no obtenga nada en absoluto. – Andrew

+0

También '(get-job $ a) .jobstateinfo.state;' – Andrew

Respuesta

28

Powershell no tiene un comando incorporado llamado Start-Thread.

V2.0, sin embargo, tiene trabajos de PowerShell, que pueden ejecutarse en segundo plano y se pueden considerar equivalentes a un hilo. Tiene los siguientes comandos a su disposición para trabajar con trabajos:

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. 

Aquí hay un ejemplo de cómo trabajar con él. Para iniciar un trabajo, el uso de puesta en trabajo y pasar un bloque de script que contiene el código que desee ejecutar de forma asincrónica:

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

Este comando iniciará un trabajo, que se lleva todos los niños en el directorio actual de forma recursiva, y usted ser devuelto a la línea de comando inmediatamente.

puede examinar la variable $job para ver si el trabajo ha terminado, etc. Si quieres que esperar para un trabajo que terminar, utilice:

wait-job $job 

Por último, para recibir los resultados de un trabajo, usar:

receive-job $job 
+4

Start-Job realmente comienza una nueva sesión de Powershell y es pesada. No comienza un hilo. – ca9163d9

+0

Start-Job no captura ningún estado de entorno, ni locales, funciones o importaciones de módulos, tiene una gran sobrecarga y es una típica API de PowerShell absorbente. Sería muy útil si .NET TPL se pudiera usar con algún despacho a la estrategia de espacio de ejecución de PS –

8

no se puede utilizar directamente las discusiones como esta, pero que no puede ser culpado por tratar ya que una vez todo el BCL está mintiendo en frente de usted no es del todo absurdo esperar que la mayor parte de que funcione :)

PowerShell ejecuta scriptblocks en canalizaciones que a su vez requieren espacios de ejecución para ejecutarlos. Escribí en mi blog acerca de cómo lanzar tus propios scripts de MT hace algún tiempo para v2 ctp3, pero la técnica (y API) sigue siendo la misma. Las principales herramientas son los tipos [runspacefactory] y [powershell]. Echar un vistazo aquí:

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

Lo anterior es la forma más ligera de acercarse MT secuencias de comandos. Hay soporte de trabajo en segundo plano en v2 por medio de start-job, get-job, pero pensé que ya lo habías visto y vi que eran bastante pesados.

4

Tengo un artículo de blog sobre cómo se puede multiplizar cualquier script de powershell dado.

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

disfrutar!

+0

¡Este script es fantástico! Muchas gracias por publicar. – Sune

+6

Este artículo ya no está disponible. –

+3

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