time.sleep - dort thread ou processus?

Réponses:

353

Il bloque le fil. Si vous regardez dans Modules / timemodule.c dans la source Python, vous verrez que dans l'appel à floatsleep(), la partie substantielle de l'opération de veille est enveloppée dans un bloc Py_BEGIN_ALLOW_THREADS et Py_END_ALLOW_THREADS, permettant à d'autres threads de continuer à s'exécuter pendant que le courant on dort. Vous pouvez également tester cela avec un simple programme 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()

Qui imprimera:

>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102
Nick Bastin
la source
3
Comment illustre un "thread" bloqué. Et pourquoi pas seulement 5 et 103 ne sont pas imprimés, alors que tous les autres nombres sont imprimés. Serait vraiment utile pour moi si quelqu'un pouvait expliquer.
akki
@akki: veuillez poser une nouvelle question plutôt que d'utiliser les commentaires d'une ancienne question. De plus, 5 est imprimé (c'est juste avant 101).
Nick Bastin
8
Ouvrir une nouvelle question pour demander le sens de cette réponse? Cela me semble assez bizarre. Et je voulais dire 11 (pas 5), désolé je ne peux pas corriger mon commentaire maintenant. J'ai en fait besoin d'aide pour comprendre ce que cette réponse tente de faire valoir.
akki
Première réponse: la fonction de plage xrange (k, m) renvoie les nombres k inclus jusqu'à m-1 inclus, donc la liste d'expressions (xrange (100, 103)) renvoie [100, 101, 102]. Cela signifie que la longueur (list (xrange (k, m))) == m - k.
Jeff Younker
3
akki, Plus précisément, time.sleep () bloque le thread qui a appelé time.sleep (), mais il libère le Python GIL pour exécuter d'autres threads (donc il ne bloque pas le processus). L'exemple de Nick n'a pas vraiment montré le blocage du thread, il a plutôt montré que le GIL est libéré (montrant ainsi que le processus N'EST PAS bloqué). Je pense que s'il avait plus de choses comme une déclaration d'impression après time.sleep (5) dans le thread waiter (), cela montrerait que l'impression ne s'est produite qu'après la fin de time.sleep (5) (c'est-à-dire le blocage)
gunit
52

Il dormira simplement le thread, sauf dans le cas où votre application n'a qu'un seul thread, auquel cas il dormira le thread et efficacement le processus également.

La documentation de python sur le sommeil ne le précise pas cependant, donc je peux certainement comprendre la confusion!

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

Zach Burlingame
la source
13

Le thread se bloquera, mais le processus est toujours en cours.

Dans une application unique, cela signifie que tout est bloqué pendant que vous dormez. Dans une application multithread, seul le thread que vous "dormez" explicitement bloquera et les autres threads s'exécuteront toujours dans le processus.

Corey Goldberg
la source
3

Seul le thread à moins que votre processus n'ait un seul thread.

Alifornie
la source
2

Le processus n'est pas exécutable par lui-même. En ce qui concerne l'exécution, le processus n'est qu'un conteneur pour les threads. Cela signifie que vous ne pouvez pas interrompre le processus du tout. Il n'est tout simplement pas applicable au processus.

Denis La Menace
la source
Hein? Cela peut être vrai sur Windows ou quelque chose, mais certainement pas universellement. Unix n'avait traditionnellement pas de threads du tout, et donc un programme Python exécute un processus (avec un seul thread, dans un sens abstrait) qui est ce que la sleepcommande mettra en pause.
tripleee du
Triste de vous décevoir, mais sur Windows et tous les systèmes * nix, l'unité principale est un thread. Vous ne pouvez pas exécuter le processus sans threads. Si vous quittez le dernier thread, le processus se termine.
Denis The Menace
Cela ne répond pas à la question. En particulier, cette question concerne Python. Python a un verrou d'interpréteur global (GIL). Si un thread devait s'endormir tout en maintenant le GIL, il bloquerait tous les threads Python dans le processus, car ils partagent tous le même verrou.
Cort Ammon
1

il bloque un thread s'il est exécuté dans le même thread pas s'il est exécuté à partir du code principal


la source