time.sleep - śpi wątek lub proces?

Odpowiedzi:

353

Blokuje wątek. Jeśli zajrzysz do Modules / timemodule.c w źródle Pythona, zobaczysz, że w wywołaniu do floatsleep()merytoryczna część operacji uśpienia jest zawinięta w bloku Py_BEGIN_ALLOW_THREADS i Py_END_ALLOW_THREADS, umożliwiając kontynuowanie wykonywania innych wątków podczas bieżącego jeden śpi. Możesz to również przetestować za pomocą prostego programu 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()

Który wydrukuje:

>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102
Nick Bastin
źródło
3
Jak to ilustruje, że „wątek” został zablokowany. I dlaczego nie tylko 5 i 103 nie zostaną wydrukowane, podczas gdy wszystkie inne liczby zostaną wydrukowane. Byłbym naprawdę pomocny, gdyby ktoś mógł wyjaśnić.
akki
@akki: zadaj nowe pytanie zamiast korzystać z komentarzy do starego pytania. Ponadto drukuje się 5 (jest tuż przed 101).
Nick Bastin
8
Otwórz nowe pytanie, aby zapytać o znaczenie tej odpowiedzi? To wydaje mi się dość dziwne. I miałem na myśli 11 (nie 5), przepraszam, nie mogę teraz poprawić mojego komentarza. Naprawdę potrzebuję pomocy w zrozumieniu, jaki sens ma ta odpowiedź.
akki
Pierwsza odpowiedź: Funkcja zakresu xrange (k, m) zwraca liczby k włącznie do m-1 włącznie, więc lista wyrażeń (xrange (100, 103)) zwraca [100, 101, 102]. Oznacza to, że długość (lista (xrange (k, m))) == m - k.
Jeff Younker,
3
akki, a dokładniej time.sleep () blokuje wątek, który wywołał time.sleep (), ale zwalnia GIL Pythona do uruchamiania innych wątków (więc nie blokuje procesu). Przykład Nicka tak naprawdę nie pokazał blokowania wątku, bardziej pokazał, że GIL jest zwolniony (co pokazuje, że proces NIE JEST zablokowany). Myślę, że gdyby miał więcej rzeczy, takich jak instrukcja print po time.sleep (5) w wątku kelnera (), oznaczałoby to, że drukowanie nie nastąpiło przed upływem time.sleep (5) (tj. Blokowanie)
gunit
52

Po prostu uśpi wątek, z wyjątkiem przypadku, gdy aplikacja ma tylko jeden wątek, w którym to przypadku uśpi wątek i skutecznie również proces.

Dokumentacja Pythona dotycząca snu nie precyzuje tego jednak, więc z pewnością mogę zrozumieć zamieszanie!

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

Zach Burlingame
źródło
13

Wątek zostanie zablokowany, ale proces nadal trwa.

W aplikacji z jednym wątkiem oznacza to, że wszystko jest blokowane podczas snu. W aplikacji wielowątkowej blokowany jest tylko wątek, który jawnie „uśpisz”, a pozostałe wątki nadal działają w tym procesie.

Corey Goldberg
źródło
3

Tylko wątek, chyba że proces ma jeden wątek.

Allando
źródło
2

Sam proces nie jest uruchamialny. Pod względem wykonania proces jest tylko pojemnikiem na wątki. Oznacza to, że nie można w ogóle wstrzymać procesu. Po prostu nie ma zastosowania do procesu.

Denis The Menace
źródło
Co? Może to być prawda w systemie Windows lub coś takiego, ale na pewno nie powszechnie. Unix tradycyjnie w ogóle nie miał wątków, dlatego program w języku Python uruchamia proces (z jednym wątkiem, w pewnym sensie abstrakcyjnym), co sleepwstrzymuje polecenie.
tripleee
Przykro mi, że cię rozczarowuję, ale w systemie Windows i wszystkich systemach * nix główna jednostka uruchomieniowa jest wątkiem. Nie można uruchomić procesu bez wątków. Jeśli wyjdziesz z ostatniego wątku, proces zostanie zakończony.
Denis The Menace
To nie odpowiada na pytanie. W szczególności to pytanie dotyczy Pythona. Python ma globalną blokadę interpretera (GIL). Jeśli wątek przejdzie w tryb uśpienia, trzymając GIL, zablokuje wszystkie wątki Pythona w tym procesie, ponieważ wszystkie mają tę samą blokadę.
Cort Ammon
1

blokuje wątek, jeśli jest wykonywany w tym samym wątku, a nie, jeśli jest wykonywany z kodu głównego


źródło