2010-03-02 11 views
5

estoy tratando de simplificar el problema de la siguiente manera,C problema # roscado

  1. Tengo alrededor archivos de más de 100 que me gustaría leer y procesar los datos
  2. Para los que mantengo matriz de nombres de archivo y ubicación
  3. I desovar hilos para hacer el trabajo de lectura de archivos.

Ahora mi problema es que me gustaría asegurarme de que solo se generan 5 subprocesos a la vez, ya que 100 + subprocesos no es una buena idea.

Así que díganme qué enfoque debo usar para asegurarme de que los 5 únicos hilos funcionen a la vez y tan pronto como uno de ellos termine, se pueda iniciar uno nuevo.

Gracias a todos,

+0

Por qué el requisito de que sólo 5 hilos funcionan a la vez? – Andrew

+0

Me gustaría que sea configurable más tarde.Por ahora me gustaría seguir con 5. –

+0

¿Por qué no dejar que el Fx decida cuántos hilos usar? Ese es el valor predeterminado con la clase ThreadPool, y hace un buen trabajo en mi experiencia. –

Respuesta

4

Yo voto por el task parallel library/Rx (incluido en .NET 4.0, pero descargable para 3.5):

 var options = new ParallelOptions(); 
     options.MaxDegreeOfParallelism = 5; 

     Parallel.ForEach(GetListOFiles(), options, (file) => 
     { 
      DoStuffWithFile(file); 
     }); 

Tenga en cuenta que esto va a usar hasta 5 hilos, pero he visto que consumen menos.

2

Divida su lista de archivos en 5 listas de tamaños iguales. A continuación, iniciar cinco hilos, y pasar cada lista más pequeño separado a través de ParameterizedThreadStart.

Sin embargo, dado que el trabajo está casi totalmente vinculado a E/S, es poco probable que este proceso se beneficie del enhebrado.

+0

@Sam: No estoy tan seguro de no tener beneficios de I/O multiproceso. No hay datos de archivo a copiar todo en la memoria, el sistema operativo tiene un mejor conocimiento de la lectura y podría optimizar, el disco podría apoyar paralelo IO (RAID?), Etc. Por supuesto, no se puede decir hasta que realmente medimos, por lo que es prematuro decir algo al respecto. –

4

Usted debe echar un vistazo a la

system.threading.threadpool.setmaxthreads

+1

Usar setmaxthreads no es realmente recomendable, a menos que realmente sepas lo que estás haciendo. Está limitando el grupo de subprocesos compartido y las bibliotecas que usa pueden terminar siendo afectadas por él. –

+0

Di esto a -1, porque generalmente es una mala práctica usar esto. –

2

Aunque esto podría no responder a su pregunta directamente, pero parece que a producer-consumer design se ajustaría a sus necesidades. Además, this podría ayudar.

2

por lo general hago este enfoque:

declara una variable entera compartida para denotar el número de hilos de trabajo. Cuando se asigna un trabajo a un hilo (sólo en cola el trabajo en ThreadPool), aumente el valor. Cuando un hilo completa el trabajo, disminuya el valor.

Asegurarse de decremento o incremento del valor entero como atómico.

En el despachador de trabajos, busque un trabajo y asigne un hilo solo si el número de hilos de trabajo es menor que el valor máximo. De lo contrario, espere una señal (que será activada por un hilo de trabajo que complete un trabajo). Si desea que el evento sea más simple, deje que el despachador simplemente haga un bucle vacío para esperar.

Lo bueno es que el valor máximo es configurable y aprovecha la ventaja del ThreadPool incorporado. Escribir un modelo de consumidor/productor para resolver un problema tan pequeño es costoso.