ã¡ãã£ã¨ããã£ãã®ã§ã¡ã¢ã
Ruby ã® Timeout ã©ã¤ãã©ãªã使ãã¨ãä¸å®ã®æéãéãã¦ãçµãããªãå¦çãä¸æãããã¨ãã§ãã¾ãã
require 'timeout' def hoge sleep end def main Timeout.timeout(3) do hoge end rescue Timeout::Error => e p 'main: timeout', e.backtrace.first end main
ãã®ã¹ã¯ãªãããå®è¡ããã¨3ç§ãã£ã¦ããçµäºãã¾ãã
% ruby t1.rb "main: timeout" "t1.rb:4:in `sleep'"
ããã¯ãã¬ã¼ã¹ãã 4è¡ç®ã® sleep ä¸ã§ã¿ã¤ã ã¢ã¦ããçºçãããã¨ããããã¾ãã
次㫠Timeout.timeout ãå ¥ãåã«ãã¦ã¿ã¾ãã
require 'timeout' def hoge Timeout.timeout(5) do sleep end rescue Timeout::Error => e p 'hoge: timeout', e.backtrace.first end def main Timeout.timeout(3) do hoge end rescue Timeout::Error => e p 'main: timeout', e.backtrace.first end main
main ä¸ã®ã¿ã¤ã ã¢ã¦ãã¯3ç§ã§ãhoge ä¸ã®ã¿ã¤ã ã¢ã¦ãã¯5ç§ã§ãã ã§ãã®ã§ sleep å®è¡ä¸ã« main ã®ã¿ã¤ã ã¢ã¦ããçºçãã¾ãã ãã®å ´å main 㨠hoge ã®ã©ã¡ãã® rescue 㧠Timeout::Error ããã£ããã§ããã®ã§ããããã ããã°ã©ã ãè¦ã㨠sleep ã«è¿ã hoge ã® rescue ã§ãã£ããã§ãããã«æãã¾ãããå®è¡ãã¦ã¿ãã¨æ¬¡ã®ããã«ãªãã¾ãã
% ruby t2.rb "main: timeout" "t2.rb:5:in `sleep'"
æ£è§£ã¯ main ã® rescue ã§ããã
使ãåæã¨ãã¦ã¯ãã®æ¹ãæã¾ããã§ããããå¤å´ã§æå®ãããã¿ã¤ã ã¢ã¦ããåããå ´åã«å å´ã®ã¿ã¤ã ã¢ã¦ãå¦çãåãã¦ãã¾ã£ã¦ã¯æ··ä¹±ãã¦ãã¾ãã¾ããã使ç¨ãã¦ããã©ã¤ãã©ãªãå é¨ã§ Timeout ã使ç¨ãã¦ãããã©ããã調ã¹ãªãã¨ãããªãã¨ããã®ã¯å¤§å¤ã§ãã
Timeout ã©ã¤ãã©ãªãå é¨ã§ãã¾ããã¨ãã£ã¦ãå©ç¨è ã«ã¨ã£ã¦èªç¶ãªæ¯ãèãã«ãªããããªä»çµã¿ã«ãªã£ã¦ãã¾ãã
ã¨ãã㧠Timeout.timeout ã«ã¯ã¿ã¤ã ã¢ã¦ãæã«çºçããä¾å¤ã¯ã©ã¹ãæå®ãããã¨ãã§ãã¾ãã ä½ãæå®ããªãã¨ä¸è¨ã®ããã« Timeout::Error ãçºçãã¾ãã
ã¨ããããTimeout::Error ã渡ãã¦ã¿ãã¨åããç°ãªãã¾ãã
require 'timeout' def hoge Timeout.timeout(5) do sleep end rescue Timeout::Error => e p 'hoge: timeout', e.backtrace.first end def main Timeout.timeout(3, Timeout::Error) do hoge end rescue Timeout::Error => e p 'main: timeout', e.backtrace.first end main
% ruby t3.rb "hoge: timeout" "t3.rb:5:in `sleep'"
hoge ã® rescue ãå®è¡ããã¦ãã¾ãã¾ããã
Timeout.timeout ã«ä¾å¤ã¯ã©ã¹ãæå®ããå ´åã¯ããTimeout ã©ã¤ãã©ãªãå é¨ã§ãã¾ããã¨ãã£ã¦ãä»çµã¿ããåããããã®ã¾ã¾æå®ããä¾å¤ãçºçããããã§ãã
Timeout.timeout ãå ¥ãåã«ãã¦ãªãã¦ãã次ã®ããã°ã©ã ãå®è¡ããã¨ã
require 'timeout' def hoge sleep rescue p 'ä½ã失æãã!' end class OreOreTimeout < StandardError end def main Timeout.timeout(3, OreOreTimeout) do hoge end rescue OreOreTimeout p 'ã¿ã¤ã ã¢ã¦ã!' end main
ãã¿ã¤ã ã¢ã¦ã!ãã§ã¯ãªããä½ã失æãã!ãã表示ããã¾ãã
% ruby t4.rb "ä½ã失æãã!"
OreOreTimeout 㯠StandardError ã®ãµãã¯ã©ã¹ãªã®ã§ rescue ã§æ¾ããã¦ãã¾ãããã§ãã StandardError ã§ã¯ãªã Exception ã®ãµãã¯ã©ã¹ã«ããã° rescue ã§æ¾ãããªãããããã¿ã¤ã ã¢ã¦ã!ãã«ãªãã¾ãã
Timeout.timeout ã«ä¾å¤ã¯ã©ã¹ãæå®ããå ´åã¯æ³¨æãã¾ãããã