2017-01-13 2 views
7

मैं network लाइब्रेरी में किए गए डिज़ाइन निर्णय को बेहतर ढंग से समझने की कोशिश कर रहा हूं। सम्मानित स्रोत a github issue और mailing list response में उल्लेख करते हैं कि network गैर-अवरुद्ध सॉकेट का उपयोग करता है। डिफ़ॉल्ट अवरोधन व्यवहार का उपयोग करने के बजाय, जब तक सॉकेट पढ़ने के लिए तैयार नहीं हो जाता तब तक वे select ब्लॉक करने के लिए उपयोग करते हैं। यह बेहतर क्यों है? किसी भी तरह से, यह अवरुद्ध हो जाता है, और network केवल उपयोगकर्ताओं को समाप्त करने के लिए एक अवरुद्ध एपीआई का खुलासा करता है। मेरा अनुमान है कि एफएफआई कॉल को अवरुद्ध करना बुरा है और select के आसपास कुछ प्रकार का जीएचसी जादू है, लेकिन मैं इसकी पुष्टि करने में सक्षम नहीं हूं।हैकेल की नेटवर्क लाइब्रेरी गैर-अवरुद्ध सॉकेट का उपयोग क्यों करती है?

एक मामूली तरफ के रूप में, मुझे में कॉल करने में select नहीं मिल रहा है। कोडबेस को पकड़ना कुछ भी नहीं बदला। मैंने अभी GHC.Event खोजा है, जो कि select को सीधे कॉल करने के बजाय उपयोग किए जाने वाले कार्यों को प्रदान करता है, लेकिन network दिखाता है कि यह भी इसका उपयोग नहीं करता है।

+1

ghc रनटाइम सिस्टम में कहीं भी एक चयन (या मतदान) लूप होना चाहिए। सामान्य रूप से, ghc हर जगह गैर-अवरुद्ध I/O का उपयोग करने का प्रयास करता है। – melpomene

+0

मैं _guess_ होगा कि यह जीएचसी के लिए 'उपज' बिंदु के रूप में प्रयोग किया जाता है, हरे रंग के थ्रेड शेड्यूलर (संभवतः) किसी अन्य थ्रेड पर नियंत्रण देते हैं? हालांकि वास्तव में नहीं जानते हैं। – Cubic

उत्तर

7

गैर-अवरुद्ध आईओ इवेंट लूप जीएचसी की रनटाइम सिस्टम (आरटीएस) का हिस्सा है। यह जीएचसी की हरी धागा प्रणाली के साथ बहुत अच्छी तरह से बातचीत करता है: एसिंक्रोनस कोड लिखने के बजाय, आप केवल हल्के धागे का उपयोग कर सकते हैं और रनटाइम सही को जागने का ख्याल रखेगा।

हास्केल में सभी आईओ डिफ़ॉल्ट रूप से गैर-अवरुद्ध है, इसलिए यदि आपके पास दो धागे हैं जो प्रत्येक एक अलग सॉकेट पर अवरुद्ध हैं, तो रनटाइम सिस्टम आंतरिक रूप से select (या कुछ अन्य प्लेटफ़ॉर्म-विशिष्ट तरीका) फ़ाइल डिस्क्रिप्टर तैयार होने पर केवल थ्रेड को जागृत करने के लिए epoll या kqueue जैसे एकाधिक फ़ाइल डिस्क्रिप्टरों पर प्रतीक्षा करें। अधिक जानकारी के लिए https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/IOManager देखें।

+0

क्या उस मॉडल को बेहतर ढंग से फिट नहीं किया जाएगा यदि 'नेटवर्क' 'चयन' के बजाय' एपोल' पर निर्भर करता है? – sapanoia

+2

ऐसा हो सकता है कि यह लिनक्स पर 'एपोल' का उपयोग करता है, मुझे लगता है कि यह मामला है। @ सपनोआया http://stackoverflow.com/a/39106000/2494803 देखें – bennofs

संबंधित मुद्दे