2012-09-13 14 views
5

किसी सर्वर के मुख्य लूप को लागू करने के लिए आम तौर पर स्वीकार्य तरीका क्या है जिसे घटनाओं के एक विषम सेट पर इंतजार करने की आवश्यकता होती है? एक मौजूदा सॉकेट परहास्केल में मुख्य सर्वर लूप लागू करें?

  • नया गर्तिका कनेक्शन
  • डेटा उपलब्ध
  • ओएस संकेत
  • तृतीय-पक्ष लाइब्रेरी कॉलबैक
  • : यह सर्वर (busywait नहीं) इंतजार करना चाहिए जब तक निम्न में से एक होता है

उत्तर

6

मुझे लगता है कि आप एक थ्रेड के साथ सी पैराडाइम के मामले में सोच रहे हैं, I/O को अनब्लॉक करते हुए, और एक चयन() कॉल।

आपको लगता है कि हास्केल में की तरह कुछ लिखने के लिए प्रबंधन कर सकते हैं, लेकिन हास्केल पेशकश करने के लिए भी बहुत कुछ है:

मैं आपको प्रत्येक बुद्धिमान संपर्क बुद्धि के लिए एक नया धागा फोर्क करने की सलाह देता हूं एच बाहरी दुनिया, और सब कुछ एसटीएम के साथ समन्वय रखें।

2

धागे के बीच सिंक्रनाइज़ करने के लिए takeMVar और putMVar का उपयोग करें। यदि ऑपरेशन की अनुमति नहीं है तो वे आम तौर पर धागे को अवरुद्ध करते हैं। ghc docs पढ़ें।

+1

या 'Chan' (इन धागे समय-समय पर समन्वय करने के लिए की जरूरत है, तो फिर, एसटीएम शायद सबसे सरल, सबसे विश्वसनीय है कि ऐसा करने के लिए तरीका है।)। मुझे वास्तव में 'चान' पसंद है। – singpolyma

1

मैं इसे स्पष्ट करना चाहता हूं कि मुझे लगता है कि पहले पोस्ट किए गए दो समाधान आपके पास विशिष्ट समस्या के लिए बेहतर हैं, लेकिन यहां आपके द्वारा प्रस्तुत की गई समस्या के प्रकार को हल करने का एक तरीका है।

इस दौर एक आसान तरीका की तरह

data SocketConn = .... 
data DataAvail = ... 
data OSSignal = ... 
data Callback = ... 

अपने परिभाषाओं लेने के लिए और

data ServerEvent = Sok SocketConn | Dat DataAvail | Sig OSSignal | Call Callback 

handleEvent :: ServerEvent -> IO() 
handleEvent (Soc s) = .... 
handleEvent (Dat d) = .... 
handleEvent (Sig o) = .... 
handleEvent (Call c) = .... 

की unsimplified संस्करण परिभाषित करने के लिए की तरह मैं कहता हूँ, अन्य उत्तर के बारे में पढ़ें है!

+1

आपको इस उत्तर को बहुत कुछ नहीं करना चाहिए; यह चीजों को करने का एक वैध तरीका है। और यह * अंतर्निहित सामान्यीकृत प्रश्न का उत्तर देता है, जो है, "इनपुट के विभिन्न आकारों की संभावना को कैसे संभाला जाता है जो सभी एक ही स्लॉट में जाते हैं?"। जैसा कि आपने सुझाव दिया है, जवाब "एक टैग किए गए संघ का उपयोग करें" है। –

+0

@ डैनबर्टन ओके, मैंने "यह मत करो" को "आपके समाधान की समस्या के लिए अन्य समाधान बेहतर" करने के लिए " – AndrewC

0

सॉफ़्टवेयर ट्रांजैक्शनल मेमोरी (एसटीएम) एक बहु-मार्ग प्रतीक्षा करने का मुख्य तरीका है।

हालांकि, चीजों के दिखने से, आपके मामले में आप शायद प्रत्येक कार्य के लिए एक अलग हास्केल थ्रेड को फेंकना चाहते हैं, और ऐसा कुछ थ्रेड ब्लॉक होने दें, जबकि कुछ भी नहीं हो रहा है।

आप एक हजार ओएस धागे नहीं बनाना चाहते हैं, लेकिन एक हजार हास्केल धागे बिल्कुल कोई परेशानी नहीं है।

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