.net समवर्ती HttpWebRequests की अधिकतम संख्या



multithreading (4)

मैं एक वेब ऐप का परीक्षण कर रहा हूं और एक विंडोज़ टेस्ट प्रोग्राम स्थापित कर चुका हूं जो कई धागे को फैलाता है और प्रत्येक पर एक वेब अनुरोध भेजता है।

समस्या यह है कि मुझे निम्न आउटपुट मिलता है:

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!

किस तरह के दिखने की तरह अधिकतम 5 धागे हैं, भले ही मैं 100 बना देता हूं:

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();
    }

क्या कोई मुझे बता सकता है कि क्या हो रहा है?

धन्यवाद

संपादित करें: अगर सुझाव दिया गया है कि मैं httpwebrequest की बजाय 5 सेकंड के लिए सोता हूं, तो मुझे अधिक थ्रेड फायरिंग मिलती है लेकिन जितनी मैंने अपेक्षा की थी उतनी नहीं:

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!

यह अभी भी दिखता है कि मुझे केवल 2 धागे मिलते हैं जो हर सेकेंड से शुरू होते हैं, जो मुझे धीमा लगता है। मुझे लगता है कि कंसोल। राइटलाइन एक समस्या हो सकती है?

संपादित करें: मैंने सेट किया

ThreadPool.SetMinThreads(100, 4); 

तथा

System.Net.ServicePointManager.DefaultConnectionLimit = 100;

और निम्नलिखित परिणाम प्राप्त हुए:

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

इसलिए एक साथ कई सारे वेब अनुरोधों को एक साथ करने में सक्षम था। जो कतार लग रहा था (एक एसटीए COM + सर्वर से बाहर बुला रहा है) तो यही मुझे उम्मीद है।

आपकी सहायता के लिए धन्यवाद


Answer #1

यदि मैं विंडोज कॉन्फ़िगरेशन में टैग नीचे लिखता हूं, तो कोड के निष्पादित होने पर हर बार इसे निष्पादित किया जाएगा। इसलिए कोड के नीचे हर बार निष्पादित किया जाता है, मुझे अधिकतम 1000000 समानांतर अनुरोध / प्रतिक्रिया की अनुमति होगी।

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

टैग

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

Answer #2

क्या आपके अनुरोधों के सभी (या अधिकतर) किसी भी अवसर पर एक ही मेजबान पर जा रहे हैं? प्रति होस्ट आधार पर अंतर्निहित सीमा है। आप इसे system.config में सिस्टम में बदल सकते हैं। connectionManagement तत्व।

दूसरी बात यह है कि थ्रेड पूल केवल धीरे-धीरे धागे की संख्या को रैंप करता है - यह हर आधे सेकेंड, आईआईआरसी में एक नया धागा शुरू करता है। क्या आप वह देख सकते हैं जो आप देख रहे हैं? समीकरण से HttpWebRequest से छुटकारा पाने का प्रयास करें - बस इसके बजाय कुछ सेकंड के लिए सो जाओ ...

मुझे संदेह है कि बाद की समस्या वह है जिसे आप शुरू में चल रहे हैं, लेकिन पहला व्यक्ति आपको भी समस्याएं पैदा करने जा रहा है।


Answer #3

मैंने .NET कोर के लिए इसके बारे में बहुत कुछ नहीं सुना है। ServicePointManager .NET Core 1 में शामिल नहीं था, लेकिन संस्करण 2 में फिर से वापस प्रतीत होता है। हालांकि, HttpClient के लिए, आप इस तरह के कनेक्शन की अधिकतम संख्या भी सेट कर सकते हैं:

new HttpClient(new HttpClientHandler
                {
                    MaxConnectionsPerServer = 100
                })

Answer #4

एक साथ आउटगोइंग HTTP कनेक्शन की संख्या में एक सीमा है। मुझे लगता है कि आप System.Net.ServicePointManager.DefaultConnectionLimit का उपयोग कर इसे नियंत्रित कर सकते हैं HttpWebRequest ऑब्जेक्ट्स बनाने से पहले स्थिर संपत्ति को HttpWebRequest करें।





multithreading