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

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




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.



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.


¿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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.