Ruby 時間制限付きでユーザコードを実行する。
IRC BOT に Ruby 式評価する機能でもと。
def safe(lvl, tm=1)
result = nil
Thread::start(lvl, tm) do |level, time|
$SAFE = level
Thread::exclusive do
timeout(time) do
tl = Thread::list
result = yield
(Thread::list - tl).each {|th| th.join}
end
end
end.join
result
end 果たしてこれでいいかは不明だけど、たぶんちゃんと動いてる。Thread.start { loop { sleep 0.1 } }; Thread.start { loop {sleep 0.1} } みたいなのを投げても大丈夫。でも何かデッドロッ(あqwせdrftgyふじこlp
だめだ。上のじゃだめ。やっぱデッドロックしてるっぽい(Thread::critical = true してみればエラーになる。 exclusive はエラー処理やってるから分からないだけだ)。他のスレッドに処理が移ってスレッド作られると困るから exclusive してるんだけど、なんか上手くいってない。とりあえず今のところ他のスレッドで新しいスレッド作ることはないから exclusive をコメントアウト。
まぁ原因は (Thread::list - tl) なんだけど。何故か全部のスレッドが入ってる。
よく分からないけど書き換え。critical 設定するとダメくさいのでもうアレやこれや。
def safe(lvl, tm=1)
result = nil
tl = Thread::list
t = Thread::start(lvl) do |level|
$SAFE = level
result = yield
end.join(tm)
(Thread::list - tl).each {|th| th.kill}
raise TimeoutError unless t
result
end
関連エントリー
- macOS の EOS Utility 「カメラとUSB接続できませんでした」 どうあがいても接続できなくて困った。 どうやらなんか Google Chrome が USB デバイスをかたっぱしからオープンする挙動をして...
- とにかく 2ch のスレは bbs2chreader に読ませたい。 bbs2chreader.user.js 誰かもう作ってるんだろうけど、見つけるより書いたほうが早い。 とにかく 2ch のスレは全部 bb...
- 数種類のタスクをタスクごとに別々の並列性ポリシー使いつつ、順次実行する (Java です) 例えばクローラみたいなのを書こうと思うと、 リモートからダウンロードしてくるタスク ストレージに格納するタスク メタデー...
- Spring MVC で @Async と @RequestScope を共存させるには? @Async と @RequestScope を同時につかうとどうなるか @RequestScope、これは @Scope(value = ...
- VisualStudio.NET と Ruby を密に連携してエロエロするメモ 一昨日と昨日やったことのまとめ。rubyclr (なんか rubyclr のサイトって title 要素の内容がないんだけど) について。 ...