सी # में एक उच्च प्रदर्शन क्रॉलर लिखा, मैं कुछ अधिकार है कि स्पष्ट रूप से प्रबंध दर्जनों या धागे के सैकड़ों जाने के लिए सबसे अच्छा तरीका नहीं है के साथ कह सकते हैं। यह किया जा सकता है (मैंने किया), लेकिन चरम में दर्दनाक है।
ने कहा। । ।
आपके आवेदन तरह से मुझे लगता है कि लिखा है, तो प्रत्येक धागा करता है कुछ इस तरह:
while (!Shutdown)
{
// get next url to crawl from somewhere
// download the data from that url
// do something with the data
}
डाउनलोड के बीच धागे को रोकने का बहुत आसान है। मैं दो ManualResetEvent
उदाहरण बनाने का सुझाव दूंगा: एक जारी रखने के लिए, और शटडाउन के लिए एक। ताकि सभी क्रॉलर धागे उन तक पहुँच सकते ये static
हैं:
static ManualResetEvent ShutdownEvent = new ManualResetEvent(false);
static ManualResetEvent ContinueEvent = new ManualResetEvent(true);
फिर, प्रत्येक धागा एक पाश में WaitAny
उपयोग करता है:
WaitHandle[] handles = new WaitHandle[] { ShutdownEvent, ContinueEvent };
while (true)
{
int handle = WaitHandle.WaitAny(handles); // wait for one of the events
if (handle == -1 || handle >= handles.Length)
{
throw new ApplicationException();
}
if (handles[handle] = ShutdownEvent)
break; // shutdown was signaled
if (handles[handle] == ContinueEvent)
{
// download the next page and do something with the data
}
}
ध्यान दें कि जब मैं handles
सरणी परिभाषित, मैं निर्दिष्ट ShutdownEvent
पहले। इसका कारण यह है कि यदि एकाधिक आइटम संकेतित होते हैं, तो WaitAny
संकेतित वस्तु से मेल खाने वाली सबसे कम अनुक्रमणिका देता है। यदि सरणी दूसरे क्रम में आबादी में थी, तो आप पहले रुकने के बिना बंद नहीं कर पाएंगे।
अब, यदि आप थ्रेड बंद करना चाहते हैं, तो ShutdownEvent.Set
पर कॉल करें। और यदि आप थ्रेड को रोकना चाहते हैं, तो ContinueEvent.Reset
पर कॉल करें जब आप थ्रेड को फिर से शुरू करना चाहते हैं, तो ContinueEvent.Set
पर कॉल करें।
डाउनलोड के बीच में रुकना थोड़ा और मुश्किल है। ऐसा करना संभव है, लेकिन समस्या यह है कि यदि आप बहुत लंबे समय तक रोकते हैं तो सर्वर टाइमआउट हो सकता है। और फिर आपको शुरुआत से डाउनलोड को पुनरारंभ करना होगा या, यदि सर्वर और आपका कोड इसका समर्थन करता है, तो उस बिंदु से डाउनलोड को पुनरारंभ करें जिस पर आपने छोड़ा था। या तो विकल्प बल्कि दर्दनाक है, इसलिए मैं डाउनलोड के बीच में रुकने का प्रयास करने का सुझाव नहीं दूंगा।
यदि आप उपयोगी प्रतिक्रिया की तरह कुछ चाहते हैं तो आपको थोड़ा और जानकारी प्रदान करने की आवश्यकता है। ये धागे क्या कर रहे हैं? वे कैसे शुरू हो गए हैं? किस स्थिति में वे "रोके गए" हैं? अधिक जानकारी के बिना, इस सवाल का जवाब देना असंभव है। –
एक प्रक्रिया में 500 धागे एक * भारी * धागे की संख्या है, खासकर यदि उनमें से एक गुच्छा अधिक समय सो रहा है। मेरी सलाह है कि मशीन में प्रोसेसर की तुलना में कोई और थ्रेड का उपयोग करने के लिए अपने आर्किटेक्चर को फिर से डिजाइन न करें। सी # में धागे बहुत "भारी" हैं; आपको नौकरी पाने के लिए आवश्यक न्यूनतम न्यूनतम बनाना चाहिए। आप क्या कर रहे हैं कि आप इतने सारे धागे बना रहे हैं? –
यह एक वेब क्रॉलिंग ऐप है। प्रत्येक थ्रेड अपने अधिकांश समय कुछ वेब सर्वर से प्रतिक्रिया के लिए इंतजार कर रहा है, सभी धागे एक ही स्थान पर शुरू हो जाते हैं, और जब उपयोगकर्ता "रोकें" बटन दबाता है तो रोका जाना चाहिए। ऐप आमतौर पर स्मृति की 700m-2G लेता है, और जब तक ऐसा करने का कोई बेहतर तरीका न हो तब तक मैं इसके साथ ठीक हूं; यहां तक कि 500 धागे पर, ऐप आमतौर पर –