هل هناك طريقة بسيطة للتحقق مما إذا كان مثيل IO IO RUBY سوف يحظر القراءة ()؟
-
06-09-2019 - |
سؤال
أبحث عن طريقة في روبي وهو أساسا هذا:
io.ready_for_read?
أنا فقط أريد التحقق مما إذا كانت معينة IO
كائن (في حالتي، نتيجة popen
استدعاء) لديه إخراج متاح، أي متابعة المتابعة io.read(1)
لن تمنع.
هذه هي الخياران الذي أراه، لا أحد الذي أعجبني:
io.read_nonblock
- رقيقة جدا تجريد يونيكسread()
- أنا لا أريد التعامل معهerrno
معالجة الأخطاء.io.select
مع مهلة 0 - يحث الغرض من هذه العملية البسيطة.
هل هناك بديل أفضل لقد أغفلت؟
المحلول
متأخرا بعض الشيء، ولكن إذا كنت require 'io/wait'
, ، يمكنك استخدام ready?
للتحقق من أن io يمكن قراءتها دون حظر. منحت، اعتمادا على مدى أن تنوي القراءة (وكيف تخطط للقيام بذلك) قد لا يزال كائن IO الخاص بك كتلة، ولكن هذا يجب أن يساعد. لست متأكدا مما إذا كانت هذه المكتبة مدعومة على جميع المنصات، وأنا لا أعرف أيضا لماذا تم فصل هذه الوظيفة عن بقية مكتبة IO. رؤية المزيد هنا: http://ruby-doc.org/stdlib/libdoc/io/wait/rdoc/
نصائح أخرى
أنا مستعد لاستنتاج أنه لا، لا توجد طريقة بسيطة للقيام بذلك. لكل اقتراح بيتر كوبر، هنا هو IO#ready_for_read?
:
class IO
def ready_for_read?
result = IO.select([self], nil, nil, 0)
result && (result.first.first == self)
end
end
على النوافذ رأيت بعض التناقضات مع IO / الانتظار. وبعد روبي لدي هنا الآن هو:
روبي 1.9.2p136 (2010-12-25) [i386-mingw32
على هذا واحد نريد و جاهز؟ يتم تنفيذها، لكنها تعيد نتائج خاطئة. في نسخة مختلفة كنت أستخدمها جاهز؟ كان لا يزال مكسورا و نريد لم تكن موجودة حتى.
احتمال واحد هو استخدام io.stat.size., ، الذي يخبرك بعدد البايتات المتاحة للقراءة في مجرى IO.http://www.ruby-doc.org/core/classes/file/stat.html.
تشير الوثائق إلى أنه من أجل الملفات، لكنني استخدمتها على الأنابيب المتصلة بعملية منفصلة (عبر Open3.popen3). انها عملت بالنسبة لي حتى الآن.