2017-01-17 1 views
1

私はHerokuでこの作業者プロセスを持っています。それは2時間ごとに実行され、Herokuが信号を終了するのを聞きます。それは正常に動作しますが、私は100%dynoの負荷を常に見ています。なぜHerokuの作業員は100%のdyno負荷を持っていますか?

私の質問は:どのように100%dynoの負荷なしでHerokuでワーカープロセスを実行するのですか?ループはdynoの負荷を引き起こしますが、無限ループの代わりに何を使用しますか?

# Scheduler here 
cleanup = Rufus::Scheduler.new 
cleanup.cron '* */2 * * *' do 
    do_some_cleaning 
end 

# Signal trapping 
Signal.trap("TERM") { 
    terminate = true 
    shut_down 
    exit 0 
} 

# Infinite loop 

while terminate == false 
end 

答えて

2

これは、スリープサイクルがない無限ループを実行しているためです。これは、基本的には、ループサイクルをただちに実行する必要があることをCPUに伝えていることを意味します。

これはすぐにCPUを使い果たします。

代わりに、あなたの無限ループに睡眠ステートメントを投げてみてください - これは、実行を一時停止し、0%にダウンあなたの使用状況をもたらす=)

while terminate == false 
    sleep 1 
end 
1

私はすぐにそれについて考えているはずです。あなたが実際に単にルーファス・スケジューラのループに参加することができます。

cleanup_scheduler = Rufus::Scheduler.new 
cleanup_scheduler.cron '* */2 * * *' do 
    do_some_cleaning 
end 

Signal.trap('TERM') do 
    shut_down 
    exit 0 
end 

cleanup_scheduler.join 

にルーファス・スケジューラのスケジューリングスレッドに参加し、擬似同等であること:

while !terminated 
    sleep 0.3 
    trigger_schedules_if_any 
end 
関連する問題