2010-12-17 7 views
8

यदि कहना है कि मैं पार्सिंग के लिए एक वेब पेज पुनर्प्राप्त करना चाहता हूं, लेकिन I/O होने पर CPU को अवरुद्ध नहीं करता हूं। क्या पाइथन की इवेंटलेट लाइब्रेरी के बराबर कुछ है?रुबी में गैर अवरोधन I/O निष्पादित करने का पसंदीदा तरीका क्या है?

उत्तर

5

मुझे यकीन नहीं है कि इवेंटलेट क्या करता है, लेकिन रूबी EventMachine है, गैर-अवरुद्ध आईओ (amongst other things) के लिए एक लाइब्रेरी है।

17

रूबी के लिए सबसे अच्छी HTTP क्लाइंट लाइब्रेरी Typhoeus है, इसका उपयोग गैर-अवरुद्ध फैशन में समानांतर में एकाधिक HTTP अनुरोध करने के लिए किया जा सकता है।

# blocking 
response = Typhoeus::Request.get("http://stackoverflow.com/") 
puts response.body 

# non-blocking 
request1 = Typhoeus::Request.new("http://stackoverflow.com/") 
request1.on_complete do |response| 
    puts response.body 
end 
request2 = Typhoeus::Request.new("http://stackoverflow.com/questions") 
request2.on_complete do |response| 
    puts response.body 
end 
hydra = Typhoeus::Hydra.new 
hydra.queue(request1) 
hydra.queue(request2) 
hydra.run # this call is blocking, though 

एक अन्य विकल्प em-http-request है, जो EventMachine के शीर्ष पर चलता है: वहाँ एक अवरुद्ध और गैर अवरुद्ध इंटरफेस है। यह एक पूरी तरह से गैर अवरुद्ध इंटरफ़ेस है:

EventMachine.run do 
    request = EventMachine::HttpRequest.new('http://stackoverflow.com/').get 
    request.callback do 
    puts request.response 
    EventMachine.stop 
    end 
end 

वहाँ भी समानांतर में कई अनुरोध, इसी तरह Typhoeus हाइड्रा को बनाने के लिए एक इंटरफेस है।

एम-http-request का नकारात्मक पक्ष यह है कि यह EventMachine से जुड़ा हुआ है। EventMachine अपने आप में एक शानदार ढांचा है, लेकिन यह एक सब कुछ या कुछ भी सौदा नहीं है। आपको अपने पूरे एप्लिकेशन को एक घटना/निरंतरता-गुजरने वाली शैली के फैशन में लिखना होगा, और यह मस्तिष्क के नुकसान के कारण ज्ञात है। टाइफियस उन अनुप्रयोगों के लिए बहुत बेहतर है जो पहले से ही नहीं किए गए हैं।

+1

जब आप कहते हैं कि हाइड्रा.रुन को कॉल अवरुद्ध कर रहा है, तो यह ठीक है, जब तक यह नींद की स्थिति में रहता है, और जब I/O पूरा हो जाता है तो जागृत हो जाता है। विंडोज़ में इवेंट संचालित I/O के साथ ही, मैं यही हासिल करना चाहता हूं। जो भी थ्रेड हाइड्रा.रुन कॉल किया जाता है, उसे ब्लॉक करते समय कोई सीपीयू नहीं लेना चाहिए, क्योंकि अनिवार्य रूप से यह किसी ईवेंट पर इंतजार कर रहा है। क्या यह हाइड्रा कैसे काम करता है? यदि नहीं, तो मुझे लगता है कि यह इस उद्देश्य को हरा देता है। अगर आप पुष्टि कर सकते हैं, तो मैं इसे स्वीकार कर लिया जाएगा। धन्यवाद। –

+1

इस तरह यह काम करता है, कोई व्यस्त इंतजार नहीं है। – Theo

+0

मेरे मामले में, मुझे वर्तमान थ्रेड को रिलीज़ करने की आवश्यकता है और बिल्कुल भी ब्लॉक नहीं करना चाहिए। 'Hydra.run' कॉल अवरुद्ध करने से बचने का कोई तरीका है? क्या कोई अन्य HTTP रूबी रत्न है जो पूरी तरह से गैर-अवरुद्ध दृष्टिकोण का समर्थन करता है? –

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