こんにちは! フリーエンジニアの長瀬です。
今回はRubyのsleepについて解説していきます!sleepってちょっと高度な技術なイメージを持たれていませんか?
今回はそんなsleepのイメージを払拭するために
- sleepの使い方
- sleepの使いどころ
という基本的な内容から、
- sleepをmsで使う
- ランダム秒sleepする
といった応用的な内容についても解説していきます。
sleepの使い方
ではまずsleepの使い方について見ていきましょう!sleepは引数に秒数を渡すことによって、その秒数分処理を停止することができます。例えば一秒ごとに数字を出力するというプログラムを書きたいときは以下のようになります。
for i in 1..10 sleep(1) print i end
[実行結果]
12345678910
sleepに秒数、今回の場合1を渡すことで、処理毎に一秒待つプログラムを作ることができました。実際に自分でプログラムを動かしてみると一秒ごとに出力されるのを確認できるので、必ず自分で動かしてみてくださいね。
sleepの使いどころ
sleepの使い方がわかったところで、sleepの使いどころについて解説していきます。sleepの使いどころは大きく分けて二つあります。
特定の秒数毎に処理を行いたい時
一つ目は「特定の秒数毎に処理を行いたい時」です。さきほどのプログラムのようにsleepの指定秒数間待つという処理を利用して、特定秒数待つプログラムを書くイメージです。
例えば
- 2秒毎に標準出力を行う
- 10秒毎に標準出力を行わせる
などが挙げられます。
処理を連続で送ると不都合が起きる時
二つ目は「処理を連続で送ると不都合が起きる時」です。Rubyではwebサイトにリクエストを送るプログラムを作ることができます。そうしたプログラムで連続でアクセスしてしまうと、相手のサーバーに負荷を与えてしまう状況も考えられます。
そうした時に、処理の間にsleepを挟むことで、相手のサーバーに配慮したプログラムを書くことができ、それが一つのマナーとなっています。
あなたがもし「API」や「スクレイピング」という類のプログラムを作成しようとしているときは、必ずsleepを考慮して書くようにしましょう!スクレイピングや、APIについての知識が浅いと感じている方は以下の記事を参考にしてください。
sleepをmsで使う
sleepの単位は秒数ですが、「ミリ秒(ms)」で使いたいという場面もあると思います。こうしたときは引数に少数を与えることで実現することができます。
例えば
sleep(0.01)
と書けば10ミリ秒のsleepを行うことができます。もちろん、以下のようにも使用できます。
for i in 1..10 sleep(0.1) print i end
[実行結果]
12345678910
ミリ秒の精度については、osの割り込み速度に依存します。高い精度でsleepを使用しなければいけない場面ではOSの割り込み速度についても調べるようにしてください。
ランダム秒sleepする
スクレイピングの場合、毎回同じ秒数で特定の処理をしているとサーバーにプログラムを検知されてしまい不正リクエストとして扱われてしまうことがあります。
そんなときはランダム秒sleepすることで、回避できることもあります。一つのテクニックとして覚えておくと、役立つ場面に今後出会うでしょう。ではサンプルコードで確認していきましょう。
random = Random.new for i in 1..10 sleep(random.rand(2.0)+2) #2〜4秒待つ print i end
[実行結果]
12345678910
小数点をランダムで扱う場合、rubyではRandomクラスのインスタンスメソッドrandを利用します。この場合はrandom.rand(2.0)+2で2〜4秒の乱数を生成して、その秒数sleepを実行しています。
randの中身を変えれば、好きな秒数間隔で乱数を発生させられるので、秒数を変更したい場合はこの部分を調整してください。rubyで乱数を扱う方法は以下の記事にまとめられているので、ぜひ参考にしてみてくださいね。
まとめ
いかがでしたでしょうか?この記事では、rubyのsleepを解説しました。sleepを使うことで、簡単に処理を止めることができるというのがわかっていただけたでしょうか。
また、APIやスクレイピングなどを利用する際は、必ずsleepの使い所を考えて適度に使用するようにしましょう。もしsleepについて忘れてしまったらこの記事を確認してくださいね!