ThreadPool max hilos


Tengo algunos problemas con ThreadPool de.NET (. NET 4).

He leído que por defecto.NET tiene un límite de 25 hilos por procesador, pero de acuerdo con las publicaciones en el foro en SO y en otros lugares, puedo aumentar el límite con el siguiente código.

void SetThreads(int threads)
{
    ThreadPool.SetMaxThreads(threads, threads);
    ThreadPool.SetMinThreads(threads, threads);
}

Sin embargo, cuando establezco lo anterior en un número arbitrariamente alto, por ejemplo, 2000, y cola ~1000 elementos, todavía solo tengo ~33 subprocesos en ejecución (. NET CLR toma ~5 subprocesos), y ThreadPool.GetAvailableThreads() devuelve 1971 subprocesos restantes.

Por qué ¿no funciona el código anterior?

Author: foxy, 2011-05-14

3 answers

De la MSDN :

Cuando la demanda es baja, el número real de subprocesos del grupo de subprocesos puede caer por debajo de los valores mínimos.

Lea esto también: Patrones para la programación Paralela: Comprender y Aplicar Patrones Paralelos con. NET Framework 4

 8
Author: Erno de Weerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-22 08:11:41

En primer lugar, su "conocimiento" de los valores predeterminados es incorrecto. El límite de 25 subprocesos por procesador regresó de. NET 1.1. Se incrementó en. NET 2, y ahora :

A partir de la versión 4 de.NET Framework, el tamaño predeterminado del grupo de subprocesos para un proceso depende de varios factores, como el tamaño del espacio de direcciones virtuales. Un proceso puede llamar al método GetMaxThreads para determinar el número de subprocesos.

Sin embargo, hay algo más en reproducir: el grupo de subprocesos no crea inmediatamente nuevos subprocesos en todas las situaciones. Para hacer frente a ráfagas de pequeñas tareas, limita la rapidez con la que crea nuevos hilos. IIRC, creará un hilo cada 0.5 segundos si hay tareas pendientes, hasta el número máximo de hilos. Sin embargo, no puedo ver esa cifra documentada de inmediato, por lo que bien puede cambiar. Sospecho que eso es lo que estás viendo. Intente poner en cola muchos elementos y luego supervise el número de hilos con el tiempo.

 72
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-14 09:14:14

Primero revisa este enlace , especialmente esta observación:

Si el tiempo de ejecución del lenguaje común está alojado, por ejemplo, por Internet Servicios de Información (IIS) o SQL Server, el host puede limitar o evitar cambios en el tamaño del grupo de subprocesos.

Entonces usted debe comprobar el valor devuelto del método ThreadPool.SetMaxThreads(threads, threads). Tal vez devuelve false?

 1
Author: Grook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-22 08:12:22