multithreading - tecnicas - ¿Cómo funciona el enhebrado en powershell?
planificacion de motricidad fina (4)
Quiero paralelizar algunas acciones de análisis de archivos con la actividad de red en powershell. Google rápido para ello, start-thread parecía una solución, pero:
El término ''inicio-hilo'' no se reconoce como el nombre de un cmdlet, función, archivo de secuencia de comandos o programa operable. Verifique la ortografía del nombre, o si se incluyó una ruta, verifique que la ruta sea correcta e intente nuevamente.
Lo mismo sucedió cuando intenté empezar a trabajar.
También intenté juguetear 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()
Entonces, creo que lo mejor sería saber qué hago mal cuando uso start-thread, porque parece funcionar para otras personas. Uso v2.0 y no necesito compatibilidad hacia abajo.
Hay un artículo sobre trabajos en segundo plano en powershell en MSDN en http://msdn.microsoft.com/en-us/library/dd878288(VS.85).aspx .
También puede leer sobre trabajos en powershell.
> help about_Jobs
No puedes usar hilos directamente de esta manera, pero no puedes ser culpado por intentarlo ya que una vez que todo el BCL está frente a ti, no es del todo tonto esperar que la mayoría funcione.
PowerShell ejecuta bloques de secuencias de comandos en tuberías que a su vez requieren espacios de ejecución para ejecutarlos. Hace un tiempo escribí sobre cómo rodar tus propios scripts MT para v2 ctp3, pero la técnica (y API) sigue siendo la misma. Las herramientas principales son los tipos [runspacefactory]
y [powershell]
. Echa un vistazo aquí:
http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx
Lo anterior es la forma más liviana de abordar las secuencias de comandos MT. Hay soporte de trabajo de fondo en v2 por medio de start-job, get-job, pero pensé que ya lo habías visto y vi que son bastante pesados.
Powershell no tiene un comando incorporado llamado Start-Thread.
V2.0, sin embargo, tiene trabajos de PowerShell, que pueden ejecutarse en segundo plano, y pueden considerarse el equivalente de 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, use start-job y pase un bloque de script que contenga el código que desea ejecutar de forma asíncrona:
$job = start-job { get-childitem . -recurse }
Este comando iniciará un trabajo, que pone a todos los hijos bajo el directorio actual de forma recursiva, y usted regresará a la línea de comandos inmediatamente.
Puede examinar la variable $job
para ver si el trabajo ha finalizado, etc. Si desea esperar a que finalice un trabajo, use:
wait-job $job
Finalmente, para recibir los resultados de un trabajo, usa:
receive-job $job
Tengo un artículo de blog sobre cómo se puede multihilo en cualquier script de powershell.
Multihilo con trabajos en PowerShell
¡Disfrutar!