3

1秒間に約1回実行する必要があるRubyスクリプトがあります。Rubyスクリプトを使用してディレクトリ内のファイルの変更を追跡しており、スクリプトで「ライブ」時間の更新を追跡したいと考えています。

基本的に、スクリプトでUnixシェルで「top」を実行するのと同じようなことを実行して、画面が1秒ごとに更新されるようにします。setIntervalJavaScriptにあるようなRubyに相当するものはありますか?

4

5 に答える 5

15

これを行うにはいくつかの方法があります。

クイックアンドダーティバージョン:

  1. シェル(コーニッシュ):

    while :; do
       my_ruby_script.rb
       sleep 1
    done
    
  2. watch(1):

    shell$ watch -n 1 my_ruby_script.rb
    

    これにより、スクリプトが1秒ごとに実行され、最新の実行の出力がターミナルに表示されたままになります。

  3. ルビーで:

    while true
       do_my_stuff
       sleep 1
    end
    

これらはすべて同じ問題に悩まされています。実際のスクリプト/関数の実行に時間がかかる場合、ループの実行は1秒未満になります。

これは、関数が1秒より長くかからない限り、関数が(ほぼ)正確に毎秒呼び出されることを確認するruby関数です。

def secondly_loop
    last = Time.now
    while true
        yield
        now = Time.now
        _next = [last + 1,now].max
        sleep (_next-now)
        last = _next
    end
end

次のように使用します。

secondly_loop { my_function }
于 2012-12-09T21:34:07.100 に答える
7

この宝石はいつでも面白いと思うかもしれません

この方法で繰り返しタスクをコーディングできます。

every 1.second do
  #your task
end
于 2012-12-09T21:31:23.580 に答える
5

別の回答で述べられているように、rb-inotifyはこの種のものに非常に適しています。使用したくない場合は、スレッドを使用するのが簡単な方法です。

a = Thread.new { loop { some_method; Thread.stop } }
b = Thread.new { loop { sleep 1; break unless a.alive?; a.run } }

ポーリングを停止するには、some_methodを使用するか、何らかの条件が満たされたときにa.killsome_methodが自身のスレッドを強制終了することを確認します。Thread.kill

このように2つのスレッドを使用すると、操作の長さに関係なく、some_methodが少なくとも毎秒実行され、自分でチェックする必要がなくなります(もちろん、スレッドスケジューリングの粒度の範囲内で)。

于 2012-12-09T23:24:42.650 に答える
3

rb-inotifyのようなものを使用して、ファイルの変更の通知を取得することを検討することをお勧めします。このようにして、「睡眠」を避け、「生きている」感覚を保つことができます。

Guard Gemドキュメントの「効率的なファイルシステム処理」セクションにいくつかの有用な情報があります:https ://github.com/guard/guard#efficient-filesystem-handling

于 2012-12-09T23:00:46.897 に答える
0

または、 ConcurrentRubygemのTimerTaskを使用することもできます

timer_task = Concurrent::TimerTask.new(execution_interval: 1) do |task|
  task.execution_interval.times{ print 'Boom! ' }
  print "\n"
  task.execution_interval += 1
  if task.execution_interval > 5
    puts 'Stopping...'
    task.shutdown
  end
end

timer_task.execute

同じリンクから抽出されたコード

于 2018-04-09T08:55:48.027 に答える