9 Stimmen

Obergrenze in Python time.sleep()?

Gibt es eine Obergrenze dafür, wie lange man einen Thread mit time.sleep() schlafen lassen kann? Ich habe Probleme mit Schlaf mein Skript für lange Zeiträume (d.h., über 1k Sekunden). Dieses Problem ist sowohl auf Windows- als auch auf Unix-Plattformen aufgetreten.

0 Stimmen

Meine Vermutung ist, dass es plattformspezifisch ist, aber ich habe nicht genug Wissen, um etwas zu beweisen.

4 Stimmen

Ja, es gibt eine Obergrenze: Wenn jemand über das Stromkabel Ihrer Maschine stolpert ;-)

4 Stimmen

Welches "Problem" haben Sie? Seien Sie konkret.

1voto

mykhal Punkte 18078

Können Sie mögliche Probleme vermeiden, indem Sie den Schlaf mit kurzer Verzögerung in die Schleife einfügen:

def sleep(n):
    for i in xrange(n):
        time.sleep(1)

1 Stimmen

Dies ist etwas besser, aber es könnte immer noch weniger als n Tage schlafen, wenn die sleep()-Aufrufe früh unterbrochen werden.

1 Stimmen

Nun, in diesem Fall ändere ich die Funktion zu: t0 = time.time(); while time.time() < t0 + n: sleep(1)

0voto

Aiden Ellis Punkte 44

Ich war auch schon in einer Situation, in der ich mir diese Frage stellen musste. In meinem Fall musste mein Faden für eine lange Zeit (Tage, Monate) schlafen. Wie matt antwortete mit der interessanten Tatsache, dass es eine Grenze gibt. in seinem und meinem System ist die Grenze 4.29Million secs + und verschiedene System hat verschiedene Grenzen, wie jemand in Mats Antwort Kommentar sagte Repl.it hat größere Grenze.

Wie auch immer, schließlich sind wir darauf beschränkt, aber ich habe eine Lösung gefunden, die darin besteht, die Sekunden in Stücke zu unterteilen mit einem max_sleep_secs und dann in einer Schleife durch diese Chunks-Liste und Sleep.

import time

def sweet_dreams(secs: float):
    DEBUG = False
    max_sleep_secs = 1000000
    secs_extra_ms = 0

    if secs > max_sleep_secs:
        if type(secs) is float:
            secs_extra_ms = str(secs).split('.')[-1]
            if secs_extra_ms:
                secs_extra_ms = secs_extra_ms.lstrip('0')

            secs_extra_ms = float(f"0.{secs_extra_ms}")

        secs = int(secs)
        secs_divide = float(secs) / max_sleep_secs  # e.g: 2.4123
        secs_int = int(secs_divide)  # e.g: 2
        secs_decimal_remainder = int(str(secs_divide).split(".")[-1])  # e.g 4123
        chunks = [max_sleep_secs for _ in range(secs_int)]
        if secs_decimal_remainder:
            chunks.append(int(str(secs_decimal_remainder).lstrip('0')))

        if secs_extra_ms:
            chunks.append(secs_extra_ms)

        if DEBUG:
            print(f"Debug [sweet_dreams]: -> Total: {secs} | Max: {max_sleep_secs} | Chunks: {chunks}")
            quit()

        for seconds in chunks:
            time.sleep(seconds)
    else:
        if DEBUG:
            print(f"Debug [sweet_dreams]: -> Total: {secs} | Max: {max_sleep_secs} | Chunks: None")
            quit()

        time.sleep(secs)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X