Weisen Sie Ruby Program an, einige Zeit zu warten

417

Wie weist man ein Ruby-Programm an, eine beliebige Zeitspanne zu warten, bevor mit der nächsten Codezeile fortgefahren wird?

user94154
quelle

Antworten:

675

So was:

sleep(num_secs)

Der num_secsWert kann eine Ganzzahl oder ein Gleitkommawert sein.

Wenn Sie dies in einer Rails-App schreiben oder die ActiveSupport-Bibliothek in Ihr Projekt aufgenommen haben, können Sie längere Intervalle mithilfe der folgenden praktischen Syntax erstellen:

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

Verwenden Sie Schlaf wie folgt:

sleep 2

Das wird 2 Sekunden lang schlafen.

Seien Sie vorsichtig, um ein Argument zu geben. Wenn Sie nur ausführen sleep, wird der Prozess für immer schlafen. (Dies ist nützlich, wenn ein Thread so lange schlafen soll, bis er aufgeweckt ist.)

Clinton N. Dreisbach
quelle
3
Warten Sie, wird es für immer schlafen oder bis es "aufgewacht" ist? Was bedeutet "aufgewacht" überhaupt?
Michael Dorst
4
@anthropomorphic Bezieht sich darauf, wenn ein anderer Thread Thread # run aufruft.
Joshua Pinter
Wenn ein anderer Thread Thread # wakeup aufruft, nehme ich an.
Chesterbr
2

Ich finde es untilsehr nützlich mit dem Schlaf. Beispiel:

> time = Time.now
> sleep 2.seconds until Time.now > time + 10.seconds # breaks when true
Varun Garg
quelle
Dies ist das Gleiche wiesleep(10.seconds)
Danielricecodes
Ja, hier ist es dasselbe, weil es die gleiche Eingabe (Zeit) verwendet, die der Schlaf bietet. Ich wollte hervorheben, wie untilman schlafen kann, bis eine Bedingung erfüllt ist (ich
mag
1

sleep 6wird für 6 Sekunden schlafen. Für eine längere Dauer können Sie auch sleep(6.minutes)oder verwenden sleep(6.hours).

Vijaya Chowdary
quelle
4
Nicht sicher über den downvotes auf diesem, aber es könnte sein , dass minutes()und hours()sind Methoden auf Numerik hinzugefügt von Ruby on Rails - also nicht Standard verfügbar in Ruby - in der Active :: Dauer - Klasse. Sie sind jedoch recht praktisch.
Jochem Schulenklopper
11
Ich denke, der Hauptgrund für Abstimmungen ist, dass @vijaya_chowdary 8 Jahre später die richtige Antwort erneut veröffentlicht hat. Ich würde es zumindest für seltsam halten ...
StahlRat
1
Ich habe genau dafür abgelehnt. Es ist kein Standard-Rubin.
Hayesk
1

Implementierung von Sekunden / Minuten / Stunden, die Schienenmethoden sind. Beachten Sie, dass implizite Rückgaben nicht erforderlich sind, aber sauberer aussehen, daher bevorzuge ich sie. Ich bin mir nicht sicher, ob Rails überhaupt .days hat oder ob es weiter geht, aber das sind die, die ich brauche.

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

Danach können Sie Folgendes tun: sleep 5.seconds5 Sekunden lang schlafen. Sie können sleep 5.minutes5 Minuten schlafen. Sie können sleep 5.hours5 Stunden schlafen. Und schließlich können Sie sleep 5.days5 Tage lang schlafen ... Sie können jede Methode hinzufügen, die den Wert von self * (Anzahl der Sekunden in diesem Zeitraum) zurückgibt. Versuchen Sie als Übung, es monatelang umzusetzen!

gsb
quelle