2010-07-14 11 views
10

मैं सोच रहा था कि ओसीएमएल बहु थ्रेड वाले वातावरण में टीसीपी पर सामान्य क्लाइंट/सर्वर इंटरैक्शन से निपटने के दौरान निष्पादन और आसानी से कार्यान्वयन के मामले में अच्छा प्रदर्शन करेगा .. मेरा मतलब है कि कुछ क्लाइंट प्रति थ्रेड होने की तरह वास्तव में सामान्य है जो डेटा प्राप्त करता है, खेल राज्यों पर संचालित परिवर्तन और उन्हें ग्राहकों को वापस भेज दें।क्या ओकैम नेटवर्किंग सर्वर लिखने के लिए उपयुक्त है?

ऐसा इसलिए है क्योंकि मुझे एक गेम के लिए एक सर्वर लिखना है और मैंने हमेशा इन चीजों को सी में किया है, लेकिन अब से मुझे पता है कि ओकैमल मुझे यह जानकर उत्सुक था कि यह ठीक रहेगा या मैं खुद को हल करने की कोशिश कर रहा हूं एक भाषा में ठेठ समस्या यह है कि अच्छी तरह से अग्रिम में फिट नहीं करता है कि ..

धन्यवाद

उत्तर

10

प्रदर्शन: शायद नहीं। ओकैमल के धागे समानांतर निष्पादन प्रदान नहीं करते हैं, वे आपके कार्यक्रम को ढांचा बनाने का एकमात्र तरीका हैं। ओकैमल रनटाइम स्वयं थ्रेड-सुरक्षित नहीं है, इसलिए एकमात्र कोड जो संभवतः एक ओकैमल थ्रेड के समानांतर में निष्पादित हो सकता है, सी कोड (बिना कॉलबैक के ओकेमल!) के बीच इंटरफेस किया जाएगा।

कार्यान्वयन के अनुसार, रन-टाइम पर एक म्यूटेक्स है, जिसे ब्लॉकिंग सी प्राइमेटिव्स को कॉल करते समय जारी किया जाता है, और महत्वपूर्ण कार्य करने वाले सी कार्यों को कॉल करते समय भी जारी किया जा सकता है।

कार्यान्वयन की आसानी: यह विश्व-परिवर्तन नहीं होगा। आपको ओकैमल और साइड पर एक पाथ्रेड जैसी लाइब्रेरी का आराम होगा। यदि आप OCaml के बारे में जो कुछ सीखा है, उसका लाभ उठाने के दौरान नई चीजों की खोज कर रहे हैं, तो मैं Jocaml की सलाह देता हूं। यह ओकैमल के साथ सिंक्रनाइज़ेशन में और बाहर जाता है, लेकिन हाल ही में एक (पुनः) पुन: कार्यान्वयन किया गया था, और यहां तक ​​कि जब यह सिंक से थोड़ा सा था, यह बहुत मजेदार है, और समवर्ती कार्यक्रमों का एक बिल्कुल नया परिप्रेक्ष्य है।

जोकामल ओकैमल के शीर्ष पर लागू किया गया है। रन-टाइम के साथ समवर्ती और सभी के साथ क्या, मुझे पूरा यकीन है कि यह अलग प्रक्रियाओं और संदेश-पासिंग का उपयोग करता है। लेकिन आपके द्वारा वर्णित आवेदन के लिए इसे ठीक करने में सक्षम होना चाहिए।

+3

जोकैम प्रोग्रामर को पास किए गए संदेश के आधार पर एक (बहुत अच्छा) समवर्ती मॉडल प्रदान करता है। आपका मूल जोकैम प्रोग्राम एक ही कैमल रनटाइम में चलता है; हुड के नीचे, संदेश उस रनटाइम के धागे के बीच भेजे जाते हैं। जोकैमल भी वितरित प्रोग्रामिंग के लिए सुविधाएं प्रदान करता है: संदेशों को पारदर्शी रूप से रनटाइम के बीच भेजा जा सकता है जिन्हें एक ही मशीन पर चलाने की आवश्यकता नहीं होती है। यदि आप इसका उपयोग करते हैं, तो विशेष मामले का कोई विशेष लाभ नहीं होता है जहां रनटाइम एक ही मशीन पर चलने लगते हैं। – Gilles

2

ओकैमल नेटवर्किंग अनुप्रयोगों के लिए बहुत अच्छा काम करेगा जब तक आप एक समय में सक्रिय रूप से कम से कम धागे के साथ रह सकते हैं — 100 से अधिक नहीं कहें। आप MLdonkey को उदाहरण के रूप में मान सकते हैं, हालांकि क्लाइंट स्पेस में नहीं, सर्वर अंतरिक्ष में।

8

ओकैमल नेटवर्क सर्वर लिखने के लिए काफी उपयुक्त है, हालांकि पास्कल के अनुसार, थ्रेडिंग पर सीमाएं हैं।

सौभाग्य से, हालांकि, इस तरह के एक कार्यक्रम को व्यवस्थित करने का एकमात्र तरीका थ्रेडिंग नहीं है। Lwt लाइब्रेरी (लाइट वेट थ्रेड के लिए) एसिंक्रोनस I/O का एक अमूर्त प्रदान करता है जो उपयोग करने में काफी आसान है (विशेष रूप से जब सिंटैक्स समर्थन के साथ संयुक्त होता है)। सब कुछ वास्तव में एक थ्रेड में चलता है, लेकिन यह सब एक एसिंक्रोनस I/O लूप (यूनिक्स select कॉल पर बनाया गया) द्वारा संचालित है, और प्रोग्रामिंग शैली आपको कोड लिखने देती है जो प्रत्यक्ष कोड की तरह दिखती है (सामान्य कोड ओवरहेड करने से बचने के लिए कई अन्य भाषाओं में एसिंक्रोनस I/O)। उदाहरण के लिए:

lwt my_message = read_message socket in 
let repsonse = compute_response my_message in 
send_response socket response 

पढ़े गए और लिखने मुख्य समारोह पाश में वापस हो, लेकिन आप से बचने के सामान्य "पढ़ा है, इस कार्यप्रणाली को कॉल आपका काम पूरा हो" मैन्युअल भूमि के ऊपर।

0

यदि आप कई प्रीपेप्टिव थ्रेड का उपयोग करना चाहते हैं तो हास्केल बेहतर विकल्प होगा। जीएचसी बड़ी संख्या में धागे का समर्थन कर सकता है और वे मल्टीकोर सिस्टम पर समानांतर में चलते हैं। ओकैम सहकारी मल्टीथ्रेडिंग और एकाधिक प्रक्रियाओं को पसंद करता है।

+0

यह बस राय है। Ocisgen cohttp के साथ मौजूद है। –

+0

@Edgar संपादित देखें – Demi

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