जैसा कि डिजाइन दर्शन के लिए, libevent में कुछ वास्तुशिल्प निर्णयों पर सुधार करने के लिए libev बनाया गया था, उदाहरण के लिए, वैश्विक चर उपयोग ने बहुक्षेत्रीय वातावरणों में libevent का सुरक्षित रूप से उपयोग करना कठिन बना दिया, चौकीदार संरचनाएं बड़ी हैं क्योंकि वे I / O, समय और संकेत को जोड़ती हैं। एक में हैंडलर, अतिरिक्त घटक जैसे http और dns सर्वर खराब कार्यान्वयन गुणवत्ता और परिणामी सुरक्षा समस्याओं से पीड़ित थे, और टाइमर अक्षम थे और समय की छलांग के साथ अच्छी तरह से सामना नहीं करते थे।
लीबिया ने इनमें से प्रत्येक को बेहतर बनाने की कोशिश की, लेकिन वैश्विक चर का उपयोग न करके, सभी कार्यों के लिए एक लूप संदर्भ का उपयोग करके, प्रत्येक घटना प्रकार के लिए छोटे वॉचर्स का उपयोग करके (एक I / O द्रष्टा x86_64 पर 56 बाइट्स का उपयोग 136 के मुकाबले libevent के लिए करता है), अतिरिक्त अनुमति देता है ईवेंट प्रकार जैसे कि वॉलकॉक बनाम मोनोटोनिक समय, इंटर-थ्रेड रुकावट के आधार पर टाइमर, अन्य इवेंट लूप को एम्बेड करने के लिए वॉचर्स तैयार करना और चेक करना और एम्बेड करना और इसी तरह।
अतिरिक्त घटक समस्या उन्हें बिल्कुल नहीं होने से "हल" है, इसलिए लिबास छोटा और कुशल हो सकता है, लेकिन आपको http लाइब्रेरी के लिए कहीं और देखने की भी आवश्यकता है, क्योंकि लिबेव में बस एक नहीं है (उदाहरण के लिए, एक है बहुत संबंधित लाइब्रेरी जिसे लिबेरियो कहा जाता है जो एसिंक्रोनस I / O करता है, जिसका उपयोग स्वतंत्र रूप से या एक साथ libev के साथ किया जा सकता है, ताकि आप मिश्रण और मिलान कर सकें)।
तो संक्षेप में, libev केवल एक चीज़ (POSIX इवेंट लाइब्रेरी) करने की कोशिश करता है, और यह सबसे कुशल तरीके से संभव है। लिबवेंट आपको पूर्ण समाधान देने की कोशिश करता है (ईवेंट लाइब, नॉन-ब्लॉकिंग आई / ओ लाइब्रेरी, एचटीटीपी सर्वर, डीएनएस क्लाइंट)।
या, और भी कम, कामदेव UNIX टूलबॉक्स दर्शन का पालन करने की कोशिश करता है, केवल एक चीज को जितना संभव हो उतना अच्छा।
ध्यान दें कि यह डिजाइन दर्शन है, जिसे मैं प्राधिकरण के साथ बता सकता हूं क्योंकि मैंने कामेच्छा को डिजाइन किया है। क्या ये डिज़ाइन लक्ष्य वास्तव में पहुंच गए हैं, या क्या दर्शन ध्वनि सिद्धांतों पर आधारित है, आपको जज करना है।
अपडेट 2017:
मुझे कई बार पूछा गया था कि मैं किस समय की अक्षमता का उल्लेख करता हूं, और क्यों libev विंडोज़ पर IOCPs का समर्थन नहीं करता है।
के रूप में टाइमर के लिए, libevent कार्यक्रम कुछ अज्ञात आधार समय के सापेक्ष समय पर होता है जो भविष्य में होता है, बिना आपको पता चले। लीबीव आपको अग्रिम में बता सकता है कि किस समय आधार का उपयोग समय सारणी का उपयोग करेगा, जो प्रोग्रामों को लिबवेंट दृष्टिकोण और लिबेव दृष्टिकोण दोनों का उपयोग करने की अनुमति देता है। इसके अलावा, libevent कभी-कभी बैकएंड के आधार पर शुरुआती समय में समाप्त हो जाएगी। पूर्व एक एपीआई मुद्दा है, उत्तरार्द्ध निर्धारण योग्य है (और तब से तय हो सकता है - मैंने जांच नहीं की)।
IOCP समर्थन के लिए - मुझे नहीं लगता कि यह किया जा सकता है, क्योंकि IOCP केवल पर्याप्त शक्तिशाली नहीं हैं। एक बात के लिए, उन्हें एक विशेष सॉकेट प्रकार की आवश्यकता होती है, जो खिड़कियों पर अनुमत हैंडल के सेट को और भी अधिक सीमित कर देगा (उदाहरण के लिए, पर्ल द्वारा उपयोग किए गए सॉकेट्स IOCPs के लिए "गलत" प्रकार के हैं)। इसके अलावा, IOCPs केवल I / O तैयार होने वाली घटनाओं का समर्थन नहीं करते हैं, वे केवल I / O वास्तविक कर सकते हैं। कुछ हैंडल प्रकारों के लिए वर्कअराउंड हैं, जैसे कि डमी 0-बाइट पढ़ना, लेकिन फिर से, यह उन हैंडल प्रकारों को सीमित कर देगा जिन्हें आप विंडोज़ पर और भी अधिक उपयोग कर सकते हैं और इसके अलावा उन सभी अनिर्दिष्ट व्यवहारों पर भरोसा नहीं करेंगे, जो सभी बर्खास्तगी प्रदाताओं द्वारा साझा नहीं किए गए हैं। ।
मेरी जानकारी के लिए, कोई अन्य इवेंट लाइब्रेरी विंडोज़ पर IOCPs का समर्थन नहीं करती है। घटना पुस्तकालय के अलावा, क्या परिवाद है, यह आपको पढ़ने / लिखने के कार्यों को कतारबद्ध करने की अनुमति देता है जो तब IOCPs के माध्यम से किया जा सकता है। चूँकि libev आपके लिए I / O नहीं करता है, इसलिए IOCPs का उपयोग करने के लिए कोई उपाय नहीं है।
यह वास्तव में डिज़ाइन के अनुसार है - कामदेव छोटा और पॉसिक्स जैसा होने की कोशिश करता है, और विंडोज़ के पास बस पॉसिक्स-शैली I / O इवेंट प्राप्त करने का एक कुशल तरीका नहीं है। यदि IOCPs महत्वपूर्ण हैं, तो आपको या तो उन्हें स्वयं उपयोग करना होगा, या वास्तव में कई अन्य चौखटों का उपयोग करना होगा जो आपके लिए I / O करते हैं और इसलिए IOCP का उपयोग कर सकते हैं।