8

Me he acostumbrado a usar Parallel.For() en las extensiones paralelas de .Net, ya que es una manera simple de paralelizar código sin tener que iniciar y mantener manualmente los hilos (lo que puede ser difícil). Ahora estoy mirando un ciclo infinito (hago algo hasta que señalo que se detenga) que deseo paralelizar, no hay un argumento libre de sobrecarga Parallel.For() para hacer esto, así que me preguntaba cuál sería el mejor enfoque aquí. ser. En principio tan sólo pudiera hacer algo como: (?)¿Cuál es la mejor manera de lograr un bucle infinito paralelo?

Parallel.For(0, int.Max) 

Pero estoy sospechando que podría no ser un patrón de espera/eficiente para la lógica de partición de trabajo para manejar

Otra opción es algo así como:

for(;;) 
{ 
    Parallel.For(0, 128, delegate() 
    { 
     // Do stuff. 
    } 
} 

Pero eso parece poco elegante y también puede resultar en una partición de trabajo ineficiente.

Ahora mi instinto es hacer esto manualmente al crear y mantener mis propios hilos, pero me gustaría obtener algunos comentarios/opiniones sobre esto. Gracias.

ACTUALIZACIÓN === ===

estoy usando una versión simplificada del código del artículo en la respuesta aceptada (He quitado el parámetro ParallelOptions). Aquí está el código ...

public class ParallelUtils 
{ 
    public static void While(Func<bool> condition, Action body) 
    { 
     Parallel.ForEach(IterateUntilFalse(condition), ignored => body()); 
    } 

    private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition) 
    { 
     while (condition()) yield return true; 
    } 
} 

Un ejemplo de uso sería:

Func<bool> whileCondFn =() => !_requestStopFlag; 
ParallelUtils.While(whileCondFn, delegate() 
{ 
    // Do stuff. 


}); 
+0

hay algún modelo de Threading que podría consumir – MethodMan

Respuesta

8
+2

La publicación de Stephen Toub es bastante avanzada para un novato como yo. Un simple ejemplo de uso en el mejor/método recomendado sería muy apreciado. –

+0

¿es este un comentario o una respuesta? – fubo

2

Si usted (en realidad) quiere algo infinito, entonces usted quiere que en el menor número de núcleos de un posible. Ninguno de los Parallel.For___ sería una buena opción.

Lo que (probablemente) necesita es un subproceso separado o una tarea creada con la opción LongRunning.

Y luego hazlo esperar en un semáforo, o como último recurso, llama a Sleep() tan a menudo como sea posible.

+1

El contexto de este problema es que se trata de un proyecto de minería de datos. Estoy tomando un código de análisis de datos que actualmente se ejecuta de forma indefinida (por ejemplo, se ejecuta durante la noche y luego señalo que se detenga a la mañana siguiente) y lo cultive en varios hilos, por lo que quiero que se ejecute indefinidamente en todos los núcleos. – redcalx

+4

@locster - Ten un hilo maestro "infinito" que crea hilo hijo para su trabajo. –

1

Teniendo en cuenta que se trata de solicitud de cálculo Infinit, pero es necesario tener algún estado finit en cada "ciclo", yo diría que cambiaría una solución con un bucle externo for(;;) para ejecutar una llamada Parallel.ForEach(...) en algún evento/estado cambio. Como una señal Monitor, event notificación, o algo así ...

Cuestiones relacionadas