2009-05-31 9 views
13

मैं रूबी में एक विधि की तलाश में हूं जो मूल रूप से यह है:क्या यह जांचने के लिए एक आसान तरीका है कि रूबी आईओ इंस्टेंस पढ़ा जाएगा()?

io.ready_for_read? 

मैं सिर्फ यह जांचना चाहता हूं कि दिया गया IO ऑब्जेक्ट (मेरे मामले में, popen कॉल का परिणाम) आउटपुट उपलब्ध है, यानी फॉलो अप कॉल io.read(1) ब्लॉक नहीं होगा।

ये दो विकल्प हैं जिन्हें मैं देखता हूं, जिनमें से कोई भी मुझे पसंद नहीं है:

  1. io.read_nonblock - यूनिक्स read() का बहुत पतला एक अंशांकन - मैं errno त्रुटि हैंडलिंग से निपटना नहीं चाहता हूं।

  2. io.select टाइमआउट 0 के साथ - इस सरल ऑपरेशन के उद्देश्य को obfuscates।

क्या कोई बेहतर विकल्प है जिसे मैंने अनदेखा किया है?

+0

मुझे नहीं लगता/लगता है। यह वास्तव में क्या है के लिए चयन है। हां, चुनें भयानक वाक्यविन्यास है, लेकिन मुझे लगता है कि सिद्धांत में आप एक "ready_for_read" बंद कर सकते हैं? आईओ में विधि टाइप करें जो चयन का उपयोग करता है। –

+0

कि 'आईओ # ready_for_read?' कार्यान्वयन मेरे लिए काम नहीं करता है - यह हमेशा सच होता है। मुझे लगता है कि समस्या यह है कि जब तक कोई वास्तविक डेटा पढ़ने के लिए न हो, तब तक दूसरी प्रक्रिया द्वारा लिखने के लिए स्ट्रीम खोला जाने तक 'IO # select' ब्लॉक) (जो मेरे मामले में यह हमेशा पहले से ही है)।मैं इसे हासिल करने के लिए एक और तरीका ट्रैक करने की कोशिश कर रहा हूं लेकिन मुझे बहुत भाग्य नहीं है। –

उत्तर

7

एक थोड़ी देर हो चुकी है, लेकिन आप require 'io/wait', जांच सकते कि आईओ को रोके बिना पढ़ा जा सकता है ready? उपयोग कर सकते हैं। अनुमोदित, आप इस पर निर्भर करते हैं कि आप कितना पढ़ना चाहते हैं (और आप इसे कैसे करने की योजना बना रहे हैं) आपका आईओ ऑब्जेक्ट अभी भी ब्लॉक हो सकता है, लेकिन इससे मदद मिलनी चाहिए। मुझे यकीन नहीं है कि यह लाइब्रेरी सभी प्लेटफ़ॉर्म पर समर्थित है, और मुझे यह भी नहीं पता कि यह कार्यक्षमता शेष आईओ लाइब्रेरी से क्यों अलग हो गई थी। यहां और देखें: http://ruby-doc.org/stdlib/libdoc/io/wait/rdoc/

6

मैं यह निष्कर्ष निकालने के लिए तैयार हूं कि नहीं, ऐसा करने के लिए कोई आसान तरीका नहीं है। प्रति पीटर कूपर के सुझाव, यहाँ IO#ready_for_read? है:

class IO 
    def ready_for_read? 
    result = IO.select([self], nil, nil, 0) 
    result && (result.first.first == self) 
    end 
end 
0

विंडोज़ पर मैंने आईओ/प्रतीक्षा के साथ कुछ विसंगतियों को देखा है। माणिक मैं यहाँ है अभी है:

माणिक 1.9.2p136 (2010-12-25) [i386-mingw32]

यह एक दोनों nread और तैयार पर? लागू किए गए हैं, लेकिन वे गलत परिणाम लौटाते हैं। एक अलग संस्करण पर मैं तैयार कर रहा था? अभी भी टूटा हुआ था और ना्रेड भी मौजूद नहीं था।

एक संभावना io.stat.size का उपयोग करना है, जो आपको आईओ स्ट्रीम में पढ़ने के लिए उपलब्ध बाइट्स की संख्या बताता है। http://www.ruby-doc.org/core/classes/File/Stat.html

प्रलेखन सुझाव देता है कि यह फाइलों के लिए है, लेकिन मैंने इसे एक अलग प्रक्रिया से जुड़े पाइप पर उपयोग किया है (रुबी के ओपन 3.popen3 के माध्यम से)। यह अब तक मेरे लिए काम किया है।

+0

एसटीडीआईएन के लिए नो-रेपो। यह शून्य पढ़ता है भले ही निश्चित रूप से पढ़ने के लिए डेटा है। –

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