From: keiju@... (ÀÐÄͷ½¼ù ) Date: 1997-02-12T14:26:03+09:00 Subject: [ruby-list:2110] Re: Thread, Exception and Timeout けいじゅ@SHLジャパンです. In [ruby-list :02103 ] the message: "[ruby-list:2103] Re: Thread, Exception and Timeout ", on Feb/12 11:39(JST) matz@caelum.co.jp (Yukihiro Matsumoto) writes: >あえて問題といえば,threadに外側から例外を発生させる方法がな >い(プロセスに対するkill(2)のようなもの)ことですが,これはな >くても何とかなりそうな気もします. スレッド間の非同期通信に使えますので, あっても良いんじゃないかしらと思 うのですが?? ここで考えているのは, あるスレッドを指定して例外を発生させる機能です. >こんな感じでどうですか? threadを2つも使っちゃいますけど. > >def timeout(sec, msg = "timeout") > x = Thread.start { yield } > y = Thread.start { > sleep sec > Thread.kill x if x.status > } > Thread.join x > if y.status > Thread.kill y > else > raise TimeoutError, msg > end >end 厳密にいえば, 別スレッドの中で起動しているので, def foo begin timeout(2) do print "A" sleep 1 return print "B" end rescue print "C" ensure print "D" end print "E" end foo みたいな処理は, イテレータを実行しているのと処理が変わってきますよね. このばあい: ADE 本当は: AD となって欲しい. スレッドに対して例外を非同期に送れれば, 以下のようにtimeoutも実現でき ますし, 純正イテレータとして実行していますので上記のような問題も発生し ません. スレッドに対して例外を送るメソッドをThread#raise()としましょう. def timeout(sec, msg = "timeout") begin x = Thread.current yield y = Thread.start { sleep sec x.raise TimeoutError, msg if x.status } ensure if y.status Thread.kill y end end end いかがでしょう?? __ ..........................................石塚 圭樹@SHLジャパン(株)... ------------->アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----