2008-09-18 7 views

Antwort

268

Es blockiert den Thread. Wenn Sie in Modules/timemodule.c in der Python-Quelle nachsehen, werden Sie sehen, dass in dem Aufruf von floatsleep() der wesentliche Teil der Operation sleep in einen Py_BEGIN_ALLOW_THREADS- und Py_END_ALLOW_THREADS-Block eingeschlossen ist, so dass andere Threads während der Ausführung weiter ausgeführt werden können der aktuelle schläft. Sie können auch mit einem einfachen Python-Programm testen dies:

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() 

Welche gedruckt wird:

>>> thread_test.run() 
0 
100 
>>> 1 
2 
3 
4 
5 
101 
6 
7 
8 
9 
10 
102 
+0

Wie funktioniert die Darstellung eines "Threads"? Und warum werden nicht nur 5 und 103 gedruckt, während alle anderen Zahlen gedruckt werden. Wäre wirklich hilfreich für mich wenn jemand das erklären könnte. – akki

+0

@akki: Bitte stellen Sie eine neue Frage, anstatt die Kommentare einer alten Frage zu verwenden. Außerdem wird 5 gedruckt (direkt vor 101). –

+2

Öffnen Sie eine neue Frage, um die Bedeutung dieser Antwort zu fragen? Das kommt mir ziemlich komisch vor. Und ich meinte 11 (nicht 5), sorry kann meinen Kommentar jetzt nicht korrigieren. Ich brauche tatsächlich etwas Hilfe, um zu verstehen, welchen Punkt diese Antwort zu machen versucht. – akki

39

Es wird nur den Thread schlafen, außer in dem Fall, wo Ihre Anwendung nur einen einzigen Thread hat, in diesem Fall wird es den Thread und effektiv den Prozess als auch schlafen.

Die Python-Dokumentation über den Schlaf legt dies jedoch nicht fest, also kann ich sicherlich die Verwirrung verstehen!

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

+2

@MichaelMrozek: ['sleep (3)' sagt: * "sleep() lässt den rufenden Thread schlafen, bis Sekunden Sekunden verstrichen sind oder ein Signal ankommt das nicht ignoriert wird." *] (Http: // man7. org/linux/man-pages/man3/sleep.3.html) Und [es gibt einen Python-Dokumentationsfehler] (http://bugs.python.org/issue23251). – jfs

8

Der Thread wird blockiert, aber der Prozess ist noch am Leben.

In einer einzigen Thread-Anwendung bedeutet dies, dass alles blockiert ist, während Sie schlafen. In einer Multithreadanwendung blockiert nur der Thread, den Sie explizit "schlafen", und die anderen Threads werden weiterhin innerhalb des Prozesses ausgeführt.

1

nur der Thread, wenn Ihr Prozess einen einzigen Thread hat.

1

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 bedeutet, dass Sie den Vorgang überhaupt nicht anhalten können. Es ist einfach nicht anwendbar für die Verarbeitung.

+0

stattgefunden hat Hä? Dies kann unter Windows oder so etwas wahr sein, aber sicherlich nicht allgemein.Unix hatte traditionell überhaupt keine Threads und so führt ein Python-Programm einen Prozess aus (mit einem einzelnen Thread, in einem abstrakten Sinn), was der 'sleep'-Befehl pausiert. – tripleee

+0

Leider enttäuschend, aber auf 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. –