time.sleep - duerme hilo o proceso?

Respuestas:

353

Bloquea el hilo. Si mira en Módulos / timemodule.c en la fuente de Python, verá que en la llamada a floatsleep(), la parte sustantiva de la operación de suspensión está envuelta en un bloque Py_BEGIN_ALLOW_THREADS y Py_END_ALLOW_THREADS, permitiendo que otros hilos continúen ejecutándose mientras el actual uno duerme También puede probar esto con un simple programa de Python:

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

Que imprimirá:

>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102
Nick Bastin
fuente
3
¿Cómo ilustra un "hilo" se ha bloqueado? Y por qué no solo no se imprimen 5 y 103, mientras que todos los demás números se imprimen. Sería realmente útil para mí si alguien pudiera explicarlo.
akki
@akki: haga una nueva pregunta en lugar de utilizar los comentarios de una pregunta anterior. Además, se imprime 5 (es justo antes de 101).
Nick Bastin el
8
¿Abrir una nueva pregunta para preguntar el significado de esta respuesta? Eso me parece bastante raro. Y quise decir 11 (no 5), lo siento, no puedo corregir mi comentario ahora. De hecho, necesito ayuda para entender qué punto está tratando de hacer esta respuesta.
akki
Primera respuesta: La función de rango xrange (k, m) devuelve los números k inclusive hasta m-1 inclusive, por lo que la lista de expresiones (xrange (100, 103)) devuelve [100, 101, 102]. Esto significa que length (list (xrange (k, m))) == m - k.
Jeff Younker
3
akki, Más específicamente, time.sleep () bloquea el hilo que llamó time.sleep (), pero libera Python GIL para ejecutar otros hilos (por lo que no bloquea el proceso). El ejemplo de Nick realmente no mostró el bloqueo del hilo, más mostró que se libera el GIL (lo que muestra que el proceso NO ESTÁ bloqueado). Creo que si tuviera más cosas como una declaración de impresión después de time.sleep (5) en el hilo de camarero (), mostraría que la impresión no sucedió hasta después de que time.sleep (5) terminó (es decir, bloqueo)
gunit
52

Solo dormirá el hilo, excepto en el caso en que su aplicación tenga un solo hilo, en cuyo caso dormirá el hilo y también el proceso de manera efectiva.

Sin embargo, la documentación de Python sobre el sueño no especifica esto, ¡así que ciertamente puedo entender la confusión!

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

Zach Burlingame
fuente
32

Solo el hilo.

finnw
fuente
13

El hilo se bloqueará, pero el proceso aún está vivo.

En una aplicación de un solo subproceso, esto significa que todo está bloqueado mientras duerme. En una aplicación multiproceso, solo se bloqueará el subproceso que explícitamente 'duerme' y los otros subprocesos aún se ejecutan dentro del proceso.

Corey Goldberg
fuente
3

Solo el hilo a menos que su proceso tenga un solo hilo.

Alifornia
fuente
2

El proceso no es ejecutable por sí mismo. En cuanto a la ejecución, el proceso es solo un contenedor para subprocesos. Lo que significa que no puedes pausar el proceso en absoluto. Simplemente no es aplicable al proceso.

Denis la amenaza
fuente
¿Eh? Esto puede ser cierto en Windows o algo así, pero ciertamente no es universal. Tradicionalmente, Unix no tenía subprocesos, por lo que un programa de Python ejecuta un proceso (con un solo subproceso, en cierto sentido abstracto), que es lo que el sleepcomando detendrá.
tripleee
Es triste decepcionarte, pero en Windows y en todos los sistemas * nix, la unidad principal es un hilo. No puede ejecutar el proceso sin hilos. Si sale del último hilo, el proceso termina.
Denis la amenaza
Esto no responde la pregunta. En particular, esta pregunta es sobre Python. Python tiene un bloqueo de intérprete global (GIL). Si un hilo se quedara dormido mientras sostenía el GIL, bloquearía todos los hilos de Python en el proceso, porque todos comparten el mismo bloqueo.
Cort Ammon
1

bloquea un hilo si se ejecuta en el mismo hilo no si se ejecuta desde el código principal


fuente