यह कोड में समझाने के लिए सबसे आसान है:एक पॉपन काम के भीतर टाइमआउट, लेकिन एक टाइमआउट के अंदर पॉपन नहीं करता है?
require 'timeout'
puts "this block will properly kill the sleep after a second"
IO.popen("sleep 60") do |io|
begin
Timeout.timeout(1) do
while (line=io.gets) do
output += line
end
end
rescue Timeout::Error => ex
Process.kill 9, io.pid
puts "timed out: this block worked correctly"
end
end
puts "but this one blocks for >1 minute"
begin
pid = 0
Timeout.timeout(1) do
IO.popen("sleep 60") do |io|
pid = io.pid
while (line=io.gets) do
output += line
end
end
end
rescue Timeout::Error => ex
puts "timed out: the exception gets thrown, but much too late"
end
मेरे दो ब्लॉकों के मानसिक मॉडल समान होता है:
तो, मुझे याद आ रही?
संपादित करें: ट्विटर पर सुझाव दिया गया है कि पहले मामले में, किसी कारण से, पाइप सॉकेट गैर-अवरोधन मोड में जाती है, लेकिन दूसरे में यह नहीं होती है। मैं किसी भी कारण से नहीं सोच सकता कि ऐसा क्यों होगा, और न ही मैं यह समझ सकता हूं कि वर्णनकर्ता के झंडे कैसे प्राप्त करें, लेकिन कम से कम एक व्यावहारिक उत्तर है? उस संभावना पर काम करना।
आप कौन सी रूबी चल रहे हैं? –
यह व्यवहार कम से कम 1.8.7 और 1.9.3 पर होता है। दोनों ब्लॉक पर सभी 60 के लिए jruby ब्लॉक, जो व्यवहार है मैं एक prei अनुमान लगाया होगा। – llimllib
ध्यान दें कि आपके 'मेरे लिए दो ब्लॉक के बीच "रखता है (" लेकिन यह एक ... ")' पहली 'नींद' पूरा होने तक इंतजार कर रहा है, क्योंकि पहले आईओ # पॉपन ब्लॉक कॉल में 'प्रतीक्षापिप() के लिए कर्तव्यपूर्वक है '। यदि आप यह नहीं चाहते हैं, तो आपके बचाव तर्क को बाल प्रक्रिया को मारने की जरूरत है। – pilcrow