.net httpwebrequest multithreading

.net - Número máximo de HttpWebRequests concurrentes



multithreading (4)

Estoy poniendo a prueba una aplicación web y he configurado un programa de prueba de Windows que genera varios hilos y envía una solicitud web para cada uno.

El problema es que obtengo el siguiente resultado:

01/09/09 11:34:04 Starting new HTTP request on 10 01/09/09 11:34:04 Starting new HTTP request on 11 01/09/09 11:34:04 Starting new HTTP request on 13 01/09/09 11:34:05 Starting new HTTP request on 14 01/09/09 11:34:05 Starting new HTTP request on 11 01/09/09 11:34:05 11 has finished! 01/09/09 11:34:05 Starting new HTTP request on 13 01/09/09 11:34:05 13 has finished! 01/09/09 11:34:05 Starting new HTTP request on 14 01/09/09 11:34:05 14 has finished! 01/09/09 11:34:05 Starting new HTTP request on 11 01/09/09 11:34:05 11 has finished! 01/09/09 11:34:05 Starting new HTTP request on 14 01/09/09 11:34:05 14 has finished! 01/09/09 11:34:05 Starting new HTTP request on 13 01/09/09 11:34:05 13 has finished! 01/09/09 11:34:05 Starting new HTTP request on 15 01/09/09 11:34:06 Starting new HTTP request on 11 01/09/09 11:34:06 11 has finished! 01/09/09 11:34:06 Starting new HTTP request on 14 01/09/09 11:34:06 14 has finished!

que parece que hay un máximo de 5 hilos, incluso si creo 100 como tal:

int numberOfThreads = Convert.ToInt32(txtConcurrentThreads.Text); List<BackgroundWorker> workers = new List<BackgroundWorker>(); for (int N = 0; N < numberOfThreads; N++) { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worker_DoWork); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); workers.Add(worker); } foreach(BackgroundWorker worker in workers) { worker.RunWorkerAsync(); }

¿Alguien puede iluminarme sobre lo que está pasando?

Gracias

EDITAR: Si, como se sugirió, duermo durante 5 segundos, en lugar de httpwebrequest, entonces obtengo más hilos disparando pero no tantos como hubiera esperado:

01/09/09 11:56:14 Starting new HTTP request on 7 01/09/09 11:56:14 Starting new HTTP request on 11 01/09/09 11:56:15 Starting new HTTP request on 12 01/09/09 11:56:15 Starting new HTTP request on 13 01/09/09 11:56:16 Starting new HTTP request on 14 01/09/09 11:56:16 Starting new HTTP request on 15 01/09/09 11:56:17 Starting new HTTP request on 16 01/09/09 11:56:17 Starting new HTTP request on 17 01/09/09 11:56:18 Starting new HTTP request on 18 01/09/09 11:56:19 Starting new HTTP request on 7 01/09/09 11:56:19 7 has finished! 01/09/09 11:56:19 Starting new HTTP request on 11 01/09/09 11:56:19 11 has finished! 01/09/09 11:56:19 Starting new HTTP request on 19 01/09/09 11:56:20 Starting new HTTP request on 20 01/09/09 11:56:20 Starting new HTTP request on 12 01/09/09 11:56:20 12 has finished!

Todavía parece que solo estoy obteniendo 2 hilos comenzando cada segundo, lo que me parece muy lento. ¿Supongo que la Console.WriteLine podría ser un problema?

EDITAR: configuré

ThreadPool.SetMinThreads(100, 4);

y

System.Net.ServicePointManager.DefaultConnectionLimit = 100;

y obtuve los siguientes resultados:

01/09/09 14:00:07 Starting new HTTP request on 11 01/09/09 14:00:07 Starting new HTTP request on 81 01/09/09 14:00:07 Starting new HTTP request on 82 01/09/09 14:00:07 Starting new HTTP request on 79 01/09/09 14:00:07 Starting new HTTP request on 83 01/09/09 14:00:07 Starting new HTTP request on 84 01/09/09 14:00:07 Starting new HTTP request on 85 01/09/09 14:00:07 Starting new HTTP request on 87 01/09/09 14:00:07 Starting new HTTP request on 88 ... 01/09/09 14:00:07 84 has finished! Took 323.0323 milliseconds 01/09/09 14:00:08 88 has finished! Took 808.0808 milliseconds 01/09/09 14:00:08 96 has finished! Took 806.0806 milliseconds 01/09/09 14:00:08 94 has finished! Took 806.0806 milliseconds 01/09/09 14:00:08 98 has finished! Took 801.0801 milliseconds 01/09/09 14:00:08 80 has finished! Took 799.0799 milliseconds 01/09/09 14:00:08 86 has finished! Took 799.0799 milliseconds 01/09/09 14:00:08 92 has finished! Took 799.0799 milliseconds 01/09/09 14:00:08 100 has finished! Took 812.0812 milliseconds 01/09/09 14:00:08 82 has finished! Took 1010.101 milliseconds

así que fue capaz de expulsar un montón de solicitudes web al mismo tiempo. Que parecía cola (llamar a un servidor STA COM +), así que eso es lo que esperaba.

Gracias por tu ayuda


¿Todas (o la mayoría) de sus solicitudes van al mismo host por casualidad? Hay un límite incorporado por host. Puede cambiar esto en app.config en el elemento System.Management connectionManagement .

La otra cosa es que el grupo de subprocesos aumenta gradualmente su cantidad de subprocesos: inicia un nuevo subproceso cada medio segundo, IIRC. ¿Podría ser eso lo que estás viendo? Intenta eliminar HttpWebRequest de la ecuación, solo duerme un par de segundos ...

Sospecho que el último problema es con el que te encuentras inicialmente, pero el primero te causará problemas también.



No he escuchado mucho sobre esto para .NET Core. ServicePointManager no se incluyó en .NET Core 1, pero parece estar de vuelta en la versión 2. Sin embargo, para HttpClient, también puede establecer la cantidad máxima de conexiones como esta:

new HttpClient(new HttpClientHandler { MaxConnectionsPerServer = 100 })


Si escribo a continuación la etiqueta en la configuración de Windows, no se ejecutará cada vez que se ejecute el código a continuación. De modo que cada vez que se ejecute el código a continuación, se me permitirá tener un máximo de 1000000 no de solicitud / respuesta en paralelo.

HttpWebRequest POSTRequest = (HttpWebRequest)WebRequest.Create("http://yahoo.com");

Etiqueta

<connectionManagement> <clear/> <add address="*" maxconnection="1000000" /> </connectionManagement>