物欲購入目録日誌 写真館
スポンサーサイト
--.--.-- (--:--) スポンサー広告
Twitterでつぶやく
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Ruby の timeoutで割り込み処理を実行する
2011.10.05 (01:45) プログラミングtrackback(0)comment(0)
Twitterでつぶやく
ikuno_kuruma.jpg


Rubyで以下のような処理をしたいなぁ~と思ったのですが、イベントドリブンなプログラムを書いたことがないのでどうやっていいのか疑問状態に、、

(1) ある時間ず~っとなのかの処理をしていて、一定時間経過もしくは一定時間毎になんかの別の処理を実行する。
(2) ある一定時間でプログラムが終了する。


このような処理を割り込み処理っていうんでしょうか?あまりよくわからんかったし、しかもプログラム例もあまりかかれていないのでどうやってrubyで書けていいのか調べているとtimeoutというものがあるらしい。

http://www.ruby-lang.org/ja/old-man/html/trap_timeout.html

これは使えるなと思って実際に上記の(1),(2)の処理を書いてみた。
たぶん、こんな感じのコードになるはず。


#! /usr/local/bin/ruby
#
# timeoutを使って以下の2つのタスクを実行
#
# (1) 一定時間経過したら,ある処理を実行する
# (2) 一定時間経過したら,プログラムを終了する
#
$KCODE="u"
require 'timeout'

# 時間設定
PROGRAM_TIMEOUT = 30
TASK_TIMEOUT = 10
# 乱数格納用配列
rd = []

begin
#
# (2) プログラムの継続時間を設定
# 一定時間(PROGRAM_TIMEOUT[sec])
# 経過したらプログラムを終了
#
timeout(PROGRAM_TIMEOUT){
begin
# (1) タスクの割り込み
# 一定時間(TASK_TIMEOUT)
# 経過したらなんかの仕事を実行
#
timeout(TASK_TIMEOUT){
# 無限ループで乱数を作って配列に入れていく
while true do
sleep 1
rd.push(rand)
end
}
# timeoutは"Timeout::Error"でキャッチしないといけない
rescue Timeout::Error
# タスクの割り込み
sum = 0.0
rd.map{|num| sum += num}
puts "平均: #{sum/rd.size.to_f}"
# メモリをフリー
rd = []
# 繰り返します
retry
end
}
# プログラムの終了はここ
rescue Timeout::Error
puts "プログラムを終了します"
end


2つのブロックが入れ子担っていて1つめが一定時間でプログラムを終了させるブロック、2番目がある一定時間毎になんらかの処理をするブロックになっています。

例では配列に乱数を1秒に1個づついれて平均を計算して出力している計算を10秒ごと実行し,30秒経過するとプログラムが終了します。

こんな感じでいいのかしらね?
prevhome next












トラックバックURL
→http://tachiphoto.blog61.fc2.com/tb.php/1480-14914eab
home
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。