Dites au programme Ruby d'attendre un certain temps

418

Comment dire à un programme Ruby d'attendre un temps arbitraire avant de passer à la ligne de code suivante?

user94154
la source

Réponses:

675

Comme ça:

sleep(num_secs)

La num_secsvaleur peut être un entier ou un flottant.

De plus, si vous écrivez ceci dans une application Rails ou si vous avez inclus la bibliothèque ActiveSupport dans votre projet, vous pouvez construire des intervalles plus longs en utilisant la syntaxe de commodité suivante:

sleep(4.minutes)
# or, even longer...
sleep(2.hours); sleep(3.days) # etc., etc.
# or shorter
sleep(0.5) # half a second
rcoder
la source
122

Utilisez le sommeil comme ça:

sleep 2

Ça va dormir pendant 2 secondes.

Soyez prudent de donner un argument. Si vous venez de courir sleep, le processus s'endormira pour toujours. (Ceci est utile lorsque vous souhaitez qu'un fil soit en veille jusqu'à ce qu'il se réveille.)

Clinton N. Dreisbach
la source
3
Attendez, dormira-t-il pour toujours, ou jusqu'à ce qu'il soit "réveillé"? Que signifie "réveillé"?
Michael Dorst
4
@anthropomorphic Cela fait référence à quand un autre thread appelle Thread # run.
Joshua Pinter
En fait, quand un autre thread appelle Thread # wakeup, je suppose.
chesterbr
2

Je trouve untiltrès utile le sommeil. exemple:

> time = Time.now
> sleep 2.seconds until Time.now > time + 10.seconds # breaks when true
Varun Garg
la source
C'est la même chose quesleep(10.seconds)
danielricecodes
Oui, ici, c'est la même chose car il utilise la même entrée (temps) que celle offerte par le sommeil. Je voulais souligner comment untilpeut être utilisé pour dormir jusqu'à ce que toutes les conditions soient remplies (j'aime aussi la façon dont la syntaxe est naturelle)
Varun Garg
1

sleep 6dormira pendant 6 secondes. Pour une durée plus longue, vous pouvez également utiliser sleep(6.minutes)ou sleep(6.hours).

vijaya chowdary
la source
4
Je ne sais pas sur les downvotes à ce sujet , mais il se pourrait que minutes()et hours()des méthodes sur numerics ajoutées par Ruby on Rails - donc pas en Ruby standard disponibles - dans la ActiveSupport :: classe Durée. Ils sont assez pratiques cependant.
Jochem Schulenklopper du
11
Je pense que la principale raison des downvotes est que @vijaya_chowdary a republié la réponse correcte votée 8 ans plus tard. Je considérerais que c'est au moins étrange ...
StahlRat
1
J'ai voté pour cela exactement. Ce n'est pas du rubis standard.
hayesk
1

Mise en place de secondes / minutes / heures, qui sont des méthodes de rails. Notez que les retours implicites ne sont pas nécessaires, mais ils ont l'air plus propres, donc je les préfère. Je ne suis pas sûr que Rails ait même des jours ou s'il va plus loin, mais ce sont ceux dont j'ai besoin.

class Integer
   def seconds
      return self
   end
   def minutes
      return self * 60
   end
   def hours
      return self * 3600
   end
   def days
      return self * 86400
   end
end

Après cela, vous pouvez faire: sleep 5.secondsdormir pendant 5 secondes. Vous pouvez faire sleep 5.minutespour dormir pendant 5 min. Vous pouvez faire sleep 5.hourspour dormir pendant 5 heures. Et enfin, vous pouvez faire sleep 5.dayspour dormir pendant 5 jours ... Vous pouvez ajouter n'importe quelle méthode qui retourne la valeur de self * (quantité de secondes dans cette période). Comme exercice, essayez de le mettre en œuvre pendant des mois!

gsb
la source