Czy w Pythonie dla * nix time.sleep()
blokuje wątek lub proces?
Czy w Pythonie dla * nix time.sleep()
blokuje wątek lub proces?
Odpowiedzi:
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
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!
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.
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.
sleep
wstrzymuje polecenie.
blokuje wątek, jeśli jest wykonywany w tym samym wątku, a nie, jeśli jest wykonywany z kodu głównego