रूबी और EventMachine

तो, EventMachine रूबी में नेटवर्किंग के लिए एक तेज और आसान ढांचा है। EventMachine एक इवेंट-ओरिएंटेड (एसिंक्रोनस) नेटवर्क कनेक्शन प्रोसेसिंग टूल का उपयोग करता है। (नेटवर्क पर बहुत सारी जानकारी नेटवर्क कनेक्शन को संसाधित करने के लिए सिंक्रोनस और एसिंक्रोनस मॉडल के बीच अंतर के लिए समर्पित है)।

चूंकि, रूसी भाषी इंटरनेट पर, इस अद्भुत मणि पर बहुत खराब जानकारी मैं इस लेख को पोस्ट कर रहा हूं।



रूबी प्रोग्रामर के लिए पर्याप्त मानक स्थापित करना:

मणि स्थापित घटना



आइए प्रलेखन से एक उदाहरण के साथ शुरू करते हैं (थोड़ा संशोधित):



require 'rubygems' require 'eventmachine' class EchoServer < EventMachine::Connection def post_init puts "  " end def receive_data data send_data ">>> #{data}" close_connection if data =~ /quit/i end def unbind puts " " end end EventMachine::run { EventMachine::start_server '', 8081, EchoServer }
      
      







अब हम क्रम में विश्लेषण करेंगे (विपरीत - यह अधिक सुविधाजनक होगा):



EventMachine :: चलाएँ - आरंभ करता है और संदेश प्रसंस्करण चक्र ( EventReactor ) शुरू करता है, इस फ़ंक्शन से वापसी केवल तभी होती है जब stop_event_loop विधि कहा जाता है । संदेश प्रसंस्करण चक्र की शुरुआत से पहले निष्पादित ब्लॉक को विधि में पारित करना संभव (और आवश्यक) है। उदाहरण के लिए, हम यहां एक सर्वर को इनिशियलाइज़ कर सकते हैं, टाइमर सेट कर सकते हैं, क्लाइंट कनेक्शन स्थापित कर सकते हैं, आदि। इस उदाहरण में, हम इको सर्वर शुरू करते हैं, इसके लिए हम विधि ( EventMachine मॉड्यूल की विधि) EventMachine :: start_server का उपयोग करते हैं , इसके पैरामीटर आईपी पते और सुनने के लिए पोर्ट हैं, हमारे उदाहरण में आईपी खाली है ताकि आप किसी भी होस्ट से कनेक्ट कर सकें। अगला और शायद सबसे महत्वपूर्ण पैरामीटर कनेक्शन हैंडलर है - उदाहरण के लिए, एक वर्ग का नाम ( EventMachine का एक उपवर्ग :: कनेक्शन ) या एक मॉड्यूल (इस मामले में, मॉड्यूल EventMachine के अज्ञात उपवर्ग के साथ मिश्रित होता है :: कनेक्शन )। इस उदाहरण में, यह इकोस्वर वर्ग है।

सर्वर से प्रत्येक कनेक्शन इकोस्वर क्लास की अपनी वस्तु को शुरू करता है !!!

मैसेज प्रोसेसिंग लूप ( EventReactor ) में, संदेशों को ट्रिगर किया जाता है - इस संदर्भ में, ये इकोस्वर क्लास के ऑब्जेक्ट के तरीकों के लिए कॉल हैं। मुख्य संदेश हैं:



उपरोक्त उदाहरण में, क्लाइंट के साथ कनेक्शन स्थापित करने के बाद, कनेक्शन बंद होने पर "सर्वर से कनेक्ट करना" संदेश प्रदर्शित होता है। जब कोई संदेश प्राप्त होता है, तो उसे send_data विधि (संदेश भेजें) का उपयोग करके वापस भेज दिया जाता है, यदि कोई संदेश छोड़ दिया जाता है, तो कनेक्शन बंद हो जाता है।

वर्ग विधियों के बारे में अधिक जानकारी के लिए, दस्तावेज़ देखें।



क्लाइंट के साथ, सब कुछ लगभग अनुरूप है - उदाहरण इंटरनेट पर पाए जा सकते हैं, जिसमें रूसी भी शामिल है।

सामान्य तौर पर, टेलनेट का उपयोग करके परीक्षण करना सबसे आसान तरीका है:

टेलनेट लोकलहोस्ट 11777



हम अधिक दिलचस्प विषयों पर विचार करेंगे।

मैं पहले से ही EventMachine का उपयोग करते हुए हब चैट पर मिला, हालांकि, इसके सभी उपहारों का उपयोग नहीं किया गया था। अब हम एक साधारण चैट लिखेंगे (मैं झूठ नहीं बोल सकता, लेकिन मुझे लगता है कि यदि आप कोड को थोड़ा ठीक करते हैं, तो एक संकेत के रूप में, EventMachine.defer विधि) वह निश्चित रूप से 1000 कनेक्शन का सामना करेगा।



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



तो, चैनल के तीन तरीके हैं: सदस्यता (सदस्यता), पुश (संदेश भेजें), सदस्यता समाप्त करें (सदस्यता समाप्त करें)। नीचे एक चैट कार्यान्वयन है (एक चैनल के साथ - एक कमरा)



 require 'rubygems' require 'eventmachine' require 'socket' class User < EventMachine::Connection @@room = EventMachine::Channel.new attr_reader :port, :ip, :sid def receive_data data @@room.push("#{ip}:#{port} >>> #{data}") close_connection if data =~ /quit/i end def unbind str = " #{ip}:#{port}\n" @@room.push(str) puts str @@room.unsubscribe(sid) end def post_init @port, @ip = Socket.unpack_sockaddr_in(get_peername) str = "  #{ip}:#{port}\n" @sid = @@room.subscribe { |msg| send_data msg } @@room.push(str) puts str end end EventMachine::run { EventMachine::start_server '', 11777, User }
      
      







सामान्य तौर पर, EventMachine का उपयोग करके प्रोग्रामिंग सामान्य से कुछ अधिक जटिल है। यह अतुल्यकालिक के कारण है, बड़ी संख्या में ब्लॉकों, प्रक्रियाओं और अधिक का उपयोग। उपरोक्त उदाहरणों में, यह लगभग दिखाई नहीं देता है, लेकिन यदि आप EventMachine का उपयोग करना चाहते हैं तो आपको इसका सामना करना पड़ेगा।



All Articles