Pregunta

Estoy construyendo un fondo de procesamiento de motor que soporta descartando tanto a ser procesado y que está-siendo-procesado.Esto es para el uso en una aplicación de winforms que requieren mucho procesamiento de algunos elementos de entrada, así que me estoy construyendo una cola de motor donde puedo poner en cola la carga de trabajo de los elementos, y cuando son procesados, me sale una notificación con los resultados.

La pregunta es, esta cola casi siempre contienen una gran cantidad de elementos para comenzar con, y pensé que en lugar de simplemente tirar todo el threadpool, me gustaría lugar de sólo los primeros N elementos en el threadpool, y mantener el relleno cuando se procesan.La razón por la que quiero hacer esto es que una vez que la pongo en el threadpool, que se ser procesados, e incluso si están etiquetados como descartes, que todavía tomará tiempo en cola.

Con la reposición de la aplicación que he hecho, me puede quitar elementos de la cola en caso de que ser descartado, y sólo se ponen en la cola cuando es su turno, por así decirlo.

Así que la pregunta es, ¿cómo se podría ir sobre el cálculo de este número N, el número de elementos a colocar y mantener en el hilo de cola del grupo.

Problemas he considerado la posibilidad de:

  • Yo podría poner en cola 2 * número de procesadores, lo que veo es un típico número de elementos, para asegurarse de que todos los procesadores son de trabajo
  • Sin embargo, si el proceso real de algunos elementos es super-rápido (lo que puede suceder), entonces la cola en el threadpool se agota antes de que mi propia clase puede reposición con más trabajo, así que tal vez me gustaría un mayor número evitar underutilizing los procesadores
  • Debo crear algunos auto-ajuste de rutina para calcular el número óptimo basado en la hora actual de cada elemento de la toma, de modo que, si son todos super-rápido, el número es mucho mayor, y si el proceso toma un poco de tiempo, deben permanecer bajo?

¿Qué te parece?

Nuevo:Ok, debido a que una de las respuestas, voy a explicar un poco más.Cada elemento de poner en la cola es introducido por algo único.Si pongo otro elemento en la cola con la misma clave como un elemento existente, que la vieja elemento que se considera "Descartados", y debe ser eliminado.Si el elemento está siendo procesado, una propiedad en la carga de trabajo del elemento se establece en true, "IsDicarded" de la propiedad, que el método de procesamiento se encarga de llamar.Si se detecta un descarta elemento, debe salir temprano, regresan ningún resultado.

Quizás debería experimentar un poco más, y tratar de verter todo en el threadpool.

Nueva pregunta:Hay un límite para el número de elementos que pueden hacer cola?Si no, entonces esto fácilmente podría simplificar mi clase un montón.

Nota:Cuando digo "largo de la tramitación", quiero decir que en el orden de 1 a 10 segundos.Es el threadpool incluso el mejor para esto?Veo las notas de toda la web acerca de "el proceso debe ser rápido", pero lo "rápido" es que nunca se menciona.Es rápido en el orden de los milisegundos aquí?

¿Fue útil?

Solución

¿Sabe usted href="http://www.codeproject.com/KB/threads/smartthreadpool.aspx" inteligente del grupo de subprocesos ?

Parece su aplicación le permite cancelar un artículo sin procesar y aumenta dinámicamente hilos como sea necesario, hasta un límite duro; Yo personalmente uso 100 * Environment.ProcessorsCount

Otros consejos

¿Es posible que usted podría simplificar el enfoque mediante la modificación de sus artículos comprobar primero que aún se requieren antes de que hagan cualquier trabajo? Esto bordear el problema de la limitación del número en la piscina, ya que sólo tiene que añadir a todos ellos y cuando cada elemento se procesa se va a salir si ya no es necesario.

  

El número de operaciones que se pueden   en cola para el grupo de subprocesos se limita   sólo por la memoria disponible; sin embargo, el   grupo de subprocesos limita el número de   hilos que pueden ser activos en el   procesar simultáneamente. Por defecto,   el límite es de 250 subprocesos de trabajo por   CPU y 1.000 de E / S subprocesos de finalización.

     

Puede controlar el número máximo de   roscas mediante el uso de los GetMaxThreads y   SetMaxThreads métodos.

http://msdn.microsoft.com/en-us/library /0ka9477y.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top