time.sleep - schläft Thread oder Prozess?

Antworten:

353

Es blockiert den Thread. Wenn Sie in der Python-Quelle in Modules / timemodule.c nachsehen, werden Sie feststellen, dass beim Aufruf von floatsleep()der wesentliche Teil der Schlafoperation in einen Py_BEGIN_ALLOW_THREADS- und Py_END_ALLOW_THREADS-Block eingeschlossen ist, sodass andere Threads während der aktuellen Ausführung fortgesetzt werden können man schläft Sie können dies auch mit einem einfachen Python-Programm testen:

import time
from threading import Thread

class worker(Thread):
    def run(self):
        for x in xrange(0,11):
            print x
            time.sleep(1)

class waiter(Thread):
    def run(self):
        for x in xrange(100,103):
            print x
            time.sleep(5)

def run():
    worker().start()
    waiter().start()

Welches wird gedruckt:

>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102
Nick Bastin
quelle
3
Wie illustriert sich ein "Thread" wurde blockiert. Und warum werden nicht nur 5 und 103 nicht gedruckt, während alle anderen Zahlen gedruckt werden? Wäre wirklich hilfreich für mich, wenn jemand erklären könnte.
Akki
@akki: Bitte stellen Sie eine neue Frage, anstatt die Kommentare einer alten Frage zu verwenden. Außerdem werden 5 gedruckt (direkt vor 101).
Nick Bastin
8
Eine neue Frage öffnen, um die Bedeutung dieser Antwort zu erfragen? Das kommt mir ziemlich komisch vor. Und ich meinte 11 (nicht 5), leider kann ich meinen Kommentar jetzt nicht korrigieren. Ich brauche tatsächlich Hilfe, um zu verstehen, welchen Punkt diese Antwort anstrebt.
Akki
Erste Antwort: Die Bereichsfunktion xrange (k, m) gibt die Zahlen k einschließlich bis m-1 einschließlich zurück, sodass die Ausdrucksliste (xrange (100, 103)) [100, 101, 102] zurückgibt. Dies bedeutet, dass Länge (Liste (x-Bereich (k, m))) == m - k.
Jeff Younker
3
akki, genauer gesagt, time.sleep () blockiert den Thread, der time.sleep () aufgerufen hat, gibt jedoch die Python-GIL frei, um andere Threads auszuführen (damit der Prozess nicht blockiert wird). Nicks Beispiel zeigte nicht wirklich das Blockieren des Threads, sondern vielmehr, dass die GIL freigegeben ist (was zeigt, dass der Prozess NICHT blockiert ist). Ich denke, wenn er nach time.sleep (5) mehr Dinge wie eine print-Anweisung im waiter () -Thread hätte, würde dies zeigen, dass der Druck erst nach dem time.sleep (5) beendet wurde (dh blockiert)
gunit
52

Der Thread wird nur in den Ruhezustand versetzt, außer in dem Fall, in dem Ihre Anwendung nur einen einzigen Thread hat. In diesem Fall wird der Thread und auch der Prozess in den Ruhezustand versetzt.

In der Python-Dokumentation zum Thema Schlaf wird dies jedoch nicht angegeben, sodass ich die Verwirrung durchaus verstehen kann!

http://docs.python.org/2/library/time.html

Zach Burlingame
quelle
32

Nur der Faden.

finnw
quelle
13

Der Thread wird blockiert, aber der Prozess läuft noch.

In einer einzelnen Thread-Anwendung bedeutet dies, dass im Schlaf alles blockiert ist. In einer Multithread-Anwendung wird nur der Thread blockiert, den Sie explizit "schlafen", und die anderen Threads werden weiterhin im Prozess ausgeführt.

Corey Goldberg
quelle
3

Nur der Thread, es sei denn, Ihr Prozess hat einen einzelnen Thread.

Alifornia
quelle
2

Der Prozess kann nicht von selbst ausgeführt werden. In Bezug auf die Ausführung ist der Prozess nur ein Container für Threads. Das heißt, Sie können den Vorgang überhaupt nicht anhalten. Es ist einfach nicht auf den Prozess anwendbar.

Denis Die Bedrohung
quelle
Huh? Dies mag unter Windows oder so wahr sein, aber sicherlich nicht universell. Unix hatte traditionell überhaupt keine Threads, und so führt ein Python-Programm einen Prozess aus (mit einem einzelnen Thread, in einem abstrakten Sinne), den der sleepBefehl anhalten wird.
Tripleee
Traurig, Sie zu enttäuschen, aber unter Windows und allen * nix-Systemen ist die Hauptlaufeinheit ein Thread. Sie können den Prozess nicht ohne Threads ausführen. Wenn Sie den letzten Thread beenden, wird der Prozess beendet.
Denis The Menace
Dies beantwortet die Frage nicht. Bei dieser Frage geht es insbesondere um Python. Python verfügt über eine globale Interpreter-Sperre (GIL). Wenn ein Thread in den Ruhezustand versetzt wird, während er die GIL hält, blockiert er alle Python-Threads im Prozess, da sie alle dieselbe Sperre verwenden.
Cort Ammon
1

Es blockiert einen Thread, wenn er im selben Thread ausgeführt wird, nicht, wenn er vom Hauptcode ausgeführt wird


quelle