Search

検索したいワードを入力してください

2019年03月07日

Rubyでsleepを使うための基本的な書き方と方法を解説

Rubyでは、次の処理を待機させる目的などで、sleepメソッドを使うことがあります。本記事では、Rubyでsleepメソッドを使うのはどのような場面か、また、どのように使うかを解説します。同じように待機処理に使えるwaitクラスも一緒に覚えておきましょう。

Rubyでsleepを使うための基本的な書き方と方法を解説

プログラミングでsleepが使われる場面

Rubyには、sleepという、一定時間プログラムの実行を待機するメソッドがあります。sleepというメソッド名からも機能の動作が予測できます。

ここでは、実際にプログラムの中でどのような用途として使うメソッドなのか、サンプルも交え、ご紹介していきます。実際のプログラムイメージを思い浮かべながら、サンプルコードを参照してみて下さい。

特定の秒数毎に処理を行いたい時

次のようなコードを記述し、「print i」によって処理内容を出力し、ループの内容を確認したいと考えた場合、このまま実行すると、コンピュータの処理速度は速いので、一気にすべての処理の値が出力されます。

下記の例では、出力結果となる「12345678910」が一気に目に飛び込んできます。しかしコンピューターの処理速度で表示されると人間はほとんど見えないので、表示速度を遅らせる必要があります。

sleepを使えば、各処理間に強制的に時間を置くことができます。実業務でも、「〇秒ごとに〇〇を行う」処理に使います。

サンプルコード

【コード記述例】
loop do
for i in 1..10
print i
end


【実行結果】
12345678910

「print i」の前に「sleep(1)」を記述すれば、1つ目の要素の出力と、2つ目の要素の出力の間には、必ず1秒の待機が入ります。

実行結果は、「1」が表示された1秒後に「12」と表示され、「1」が表示されてから「12345678910」の表示になるまで、確実に9秒以上かかることになります。

処理を連続で送ると不都合が起きる時

Rubyは、Webのショッピングサイトの開発にもよく使われています。ユーザは、ショッピングサイトで、購入申込のボタンをクリックしますが、これはプログラムとしてはサーバにリクエストを送るという処理が行われています。

プログラムによるリクエスト処理が集中すると、サーバへの負荷が高くなる可能性があります。サーバ負荷が集中することを避けるために、sleepをはさみ、処理にゆとりを持たせる実装をします。

Rubyでのsleepの使い方と書き方

それでは、Rubyのプログラムの中で、実際にsleepを使ってみましょう。Rubyの開発環境があれば、ここからの解説の中でご紹介するコード記述例を、実際の環境で実行してみると、sleepの細かな動きまで理解できます。

Rubyのsleepメソッドの書き方の基本

Rubyのsleepメソッドでは、プログラムの実行を停止させる秒数を指定します。sleepの引数として、0以上の数字を指定します。0以上であれば、小数点を含んだ数字でも構いません。0.5のような1未満の数字でも指定可能です。

【sleepの書き方】
sleep(sec)

secは秒数を指定します。省略すると、他スレッドからの Thread#run などで明示的に再開させない限り、永久にスリープします。

2種類のsleeの書き方と実行結果
【コード記述例】
puts Time.now
ret = sleep 1
puts Time.now
puts ret


【実行結果】
2019-03-02 11:20:49 +0900
2019-03-02 11:20:50 +0900
1
【コード記述例】
puts Time.now
ret = sleep(1)
puts Time.now
puts ret


【実行結果】
2019-03-02 11:21:39 +0900
2019-03-02 11:21:40 +0900
1

sleep秒数をミリ秒単位にする

Rubyのsleepメソッドの引数は、秒単位です。しかし、プログラムを扱う際は、ミリ秒の指定が必要になる場面もあります。sleepの引数は秒単位ですが、1未満の少数も有効です。

ミリ秒の指定が必要なときは、単に引数に少数を使うだけで実現できます。

【コード記述例】
sleep(0.01)

上記の記述は、100分の1秒を指定しているので、1ミリ秒を指定していることになります。

停止時間をランダムにする方法

処理によっては、毎回同じ秒数で、特定の処理をしていると、サーバーにプログラムを検知され、不正リクエストとして扱われてしまうことがあります。よくある例としてはGoogle検索を使ってたスクレイピングで、CAPTCHAという人間判別テストが表示されてしまいます。

こうした不具合を避けるために、実業務としてのプログラミングの中では、ランダムな秒数のsleep処理を記述することで、回避させることができます。ランダムな秒数をsleepの引数として与える方法は、覚えておくといざというときに役に立ちます。

サンプルコード

ランダムな時間sleep処理を行うための、コード記述は以下のように行います。このサンプルでは、sleep時間を2〜4秒の間の時間をランダムに割り当てます。

【コード記述例】
random = Random.new

for i in 1..10
sleep(random.rand(2.0)+2)
print i
end


このサンプルの「rand」の値を変えることで、任意のランダム数を作ることができます。

Rubyはwaitクラスを使って待機処理を作ることもできる

Rubyによるプログラムの中で、処理を一定時間停止させる技術として、sleepメソッドを使う方法のほかに、waitクラスを使う方法もあります。waitクラスを使う場合、untilメソッドを使い、「条件が整うまで保留」にあたる処理を記述することができます。

sleepメソッドでは、単純に一定時間待ち状態にする場合は、手軽に使うことができますが、「条件が整うまで」といった使い方はできません。

waitクラスの使い方

waitクラスを使って、処理の待機条件を設定する場合のコードは、以下のように記述します。以下のコード記述例では、タイマーを60秒設定して、その間に指定した要素がみつかるまで待機します。untilで定義した条件が実現したら、次の処理に移行します。

「timeout」で設定しているタイマーの秒数と、「until」で設定している条件の実現は、OR条件で結ばれているイメージです。

waitクラスを使ったコード記述例
require 'selenium-webdriver'
driver =Selenium::WebDriver.for :chrome
wait = Selenium::WebDriver::Wait.new(:timeout => 60)

# untilメソッドには「~するまで」という条件を設定します
wait.until {driver.find_element(:id, 'btn_OK').displayed?}

# 待機条件を満たしたときに行う処理を書きます
driver.find_element(:id, 'btn_OK').click

wait処理がエラーになるときの対処

waitが期待どおりに機能せず、エラーになってしまう場合は、sleepを使って以下のような代替コードを記述できます。

【コード記述例】
loop do
if driver.find_elements(:id, 'btn_OK').size > 0
break
else
sleep 0.5
end
end

driver.find_element(:id, 'btn_OK').click

sleepとwaitどちらを使う?

Rubyで待機処理を記述したい場合、sleepとwaitどちらを使うべきなのでしょう。もちろん「行うべき処理に応じて」ということになりますが、待機時間を「おおよそこのくらい」というあいまいな時間にするのであれば、waitを使った方が待機時間を適正に抑えることができます。

プログラミング経験のある人は、waitを積極的に使っていくことをおすすめします。無駄な待機がない効率的なプログラミングができます。

Rubyの待機処理でsleepを試してみよう!

Rubyで待機処理に使えるコードとしては、sleepメソッドが代表ともいえます。効率的な待機処理を行う場合は、waitクラスを使って実装するのがおすすめですが、プログラミングに不慣れな人は、使い方の簡単なsleepで動作確認してみましょう。

ただし、sleepも引数となる秒数を設定し忘れるといった凡ミスで、無限停止に陥るリスクがあるので、簡単とはいえ、メソッドを理解し、慎重に実装する必要があります。

多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related