time.sleep - sleep thread o processo?


Risposte:


353

Blocca il filo. Se guardi in Modules / timemodule.c nel sorgente Python, vedrai che nella chiamata a floatsleep(), la parte sostanziale dell'operazione sleep è racchiusa in un blocco Py_BEGIN_ALLOW_THREADS e Py_END_ALLOW_THREADS, consentendo ad altri thread di continuare l'esecuzione mentre uno dorme. Puoi anche testarlo con un semplice programma 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()

Che stamperà:

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

3
Come viene illustrato un "thread" è stato bloccato. E perché non solo 5 e 103 non vengono stampati, mentre tutti gli altri numeri vengono stampati. Sarebbe davvero utile per me se qualcuno potesse spiegare.
Akki

@akki: per favore fai una nuova domanda piuttosto che usare i commenti di una vecchia domanda. Inoltre, 5 viene stampato (è giusto prima del 101).
Nick Bastin,

8
Aprire una nuova domanda per porre il significato di questa risposta? Mi sembra abbastanza strano. E intendevo 11 (non 5), mi dispiace non posso correggere il mio commento ora. In realtà ho bisogno di aiuto per capire quale sia il punto che questa risposta sta cercando di chiarire.
Akki

Prima risposta: la funzione di intervallo xrange (k, m) restituisce i numeri k compresi fino a m-1 inclusi, quindi l'elenco delle espressioni (xrange (100, 103)) restituisce [100, 101, 102]. Ciò significa che length (list (xrange (k, m))) == m - k.
Jeff Younker,

3
akki, Più specificamente, time.sleep () blocca il thread che ha chiamato time.sleep (), ma rilascia Python GIL per eseguire altri thread (quindi non blocca il processo). L'esempio di Nick non ha davvero mostrato il blocco del thread, ma ha anche mostrato che il GIL è stato rilasciato (mostrando così che il processo NON è bloccato). Penso che se avesse avuto più cose come un'istruzione print dopo time.sleep (5) nel thread del cameriere (), mostrerebbe che la stampa non è avvenuta fino a quando il time.sleep (5) non è finito (cioè blocco)
gunit,

52

Dormirà solo il thread, tranne nel caso in cui l'applicazione abbia solo un singolo thread, nel qual caso dormirà il thread ed efficacemente anche il processo.

La documentazione di Python in modalità sleep non specifica tuttavia questo, quindi posso certamente capire la confusione!

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




13

Il thread si bloccherà, ma il processo è ancora attivo.

In una singola applicazione thread, ciò significa che tutto viene bloccato mentre dormi. In un'applicazione multithread, solo il thread che "dormi" esplicitamente verrà bloccato e gli altri thread verranno comunque eseguiti all'interno del processo.


3

Solo il thread a meno che il processo non abbia un singolo thread.


2

Il processo non è eseguibile da solo. Per quanto riguarda l'esecuzione, il processo è solo un contenitore per i thread. Ciò significa che non è possibile mettere in pausa il processo. Semplicemente non è applicabile al processo.


Eh? Questo può essere vero su Windows o qualcosa del genere, ma certamente non universalmente. Unix tradizionalmente non aveva affatto thread, quindi un programma Python esegue un processo (con un singolo thread, in qualche senso astratto) che è ciò che il sleepcomando mette in pausa.
tripleee

Triste per deluderti, ma su Windows e su tutti i sistemi * nix l'unità principale in esecuzione è un thread. Non è possibile eseguire il processo senza thread. Se si esce dall'ultimo thread, il processo termina.
Denis The Menace,

Questo non risponde alla domanda. In particolare, questa domanda riguarda Python. Python ha un Global Interpreter Lock (GIL). Se un thread dovesse andare in modalità di sospensione mentre si tiene premuto GIL, bloccherebbe tutti i thread di Python nel processo, perché condividono tutti lo stesso blocco.
Cort Ammon,

1

blocca un thread se viene eseguito nello stesso thread e non se viene eseguito dal codice principale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.