2011-01-05 22 views
18

Entiendo que el nuevo TPL (Task Parallel Library) ha implementado el Parallel.ForEach() de modo que funcione con "paralelismo expresado". Es decir, no garantiza que sus delegados se ejecutarán en varios hilos, sino que comprueba si la plataforma de host tiene múltiples núcleos, y si es verdadero, solo distribuye el trabajo entre los núcleos (esencialmente 1 hilo por núcleo) ..NET 4 ... Parallel.ForEach() pregunta

Si el sistema host no tiene múltiples núcleos (cada vez es más difícil encontrar una computadora), ejecutará el código de forma secuencial como lo haría un ciclo foreach "regular". Bastante genial, francamente.

Normalmente me gustaría hacer algo como lo siguiente para colocar mi operación de larga ejecución de un subproceso de fondo de la ThreadPool:

ThreadPool.QueueUserWorkItem (nueva WaitCallback (targetMethod), nuevo Object2PassIn());

En una situación en la que la computadora host solo tiene un solo núcleo, ¿el TPL Parallel.ForEach() coloca automáticamente la invocación en una cadena de fondo? O bien, ¿debería invocar de manera ordenada cualquier llamada TPL desde un segundo plano, de modo que si estoy ejecutando desde una única computadora central, al menos esa lógica estará fuera del hilo de envío de la GUI?

Mi preocupación es que si dejo el TPL a cargo de todo esto, quiero asegurarme si determina que es una caja de un solo núcleo que sigue identificando el código que está dentro del lazo Parallel.ForEach() en un hilo de fondo como lo hubiera hecho, para no bloquear mi GUI.

Gracias por cualquier pensamientos o consejos que pueda tener ...

+1

Solo un rápido seguimiento de esto: TPL Rocks! No puedo olvidar cuánto más rápido puedo hacer varias aplicaciones con solo unos pequeños ajustes usando llamadas TPL en comparación con la tarifa "estándar". Estoy viendo los tiempos de procesamiento en varios artículos recortados en más del 80%. MS realmente lo dejó fuera del parque en este caso, gran trabajo chicos. – BonanzaDriver

Respuesta

19

Sus suposiciones son incorrectas.
Parallel.For es, siempre, una llamada de bloqueo.

Incluso si la computadora tiene múltiples núcleos, aún esperará a que todos los hilos terminen antes de regresar.

Si no desea congelar la interfaz de usuario, siempre tendrá que llamar explícitamente a ThreadPool.

+0

Enfriar: gracias a SLaks – BonanzaDriver

+3

Siempre se puede incluir en una Tarea, y usar una continuación para esperar a que se complete, y luego notificar a la IU. –

0

Creo que si tiene requisitos exactos sobre el número de instancias/hilos, debe hacerlo usted mismo. Me da la impresión de que el tipo de llamadas Parallel.ForEach es para obtener núcleos de forma declarativa. No lo sé con certeza, pero sospecho furtivamente que sería una mala elección para algo que bloquea el E/S (como ejemplo).

+0

A partir de la documentación que he leído hasta ahora, se concibió originalmente para conjuntos de problemas "vinculados al procesador". Pero esto no es para descartar el uso de IO. De hecho, lo que me llevó a examinar seriamente el TPL es el hecho de que tengo una aplicación que realiza aproximadamente 7,800 consultas web ... Tengo un procesador dual quad core (3.0 GHz Xeons) que ejecuta 24 GB de RAM en Windows 7 Ultimate edición de 64 bits ... y estos demoran entre 25 y 28 minutos en completarse. Hay un procesamiento adicional de la descarga HTML, pero entiendes mi punto. Cambié esto a una llamada TPL y tardó <5 minutos. – BonanzaDriver

0

Buena pregunta. Supongo que todavía generará un hilo, incluso si solo hay un solo núcleo.

Tendría que ejecutar una prueba en una sola máquina central. Como no tengo ninguno, usaré la máquina virtual y estableceré la CPU del entorno it en 1 y veré la cantidad de hilos que generará Parallel ForEach.

Es posible que desee leer lo siguiente:

Does Parallel limit the Number of Active Threads

1

A través de mi experiencia con Parallel.ForEach y Parallel.For bucles, me he dado cuenta que el orden puede estar fuera de servicio, algo que es posible que desee para considerar antes de implementar.

Tal como una base para el bucle producirá:

Producto 1 Producto 2 Producto 3 Producto 4

y el bucle paralelo puede producir, pero no siempre:

Producto 3 Producto 1 Producto 2 Producto 4

Solo téngalo en cuenta muchachos.