No Python para * nix, time.sleep()
bloqueia o thread ou o processo?
No Python para * nix, time.sleep()
bloqueia o thread ou o processo?
Respostas:
Ele bloqueia o fio. Se você procurar em Modules / timemodule.c na fonte Python, verá que, na chamada para floatsleep()
, a parte substantiva da operação sleep está envolvida em um bloco Py_BEGIN_ALLOW_THREADS e Py_END_ALLOW_THREADS, permitindo que outros threads continuem sendo executados enquanto o atual um dorme. Você também pode testar isso com um simples programa 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()
Qual será impresso:
>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102
Ele apenas dorme o encadeamento, exceto no caso em que seu aplicativo possui apenas um único encadeamento; nesse caso, ele dorme o encadeamento e efetivamente o processo também.
A documentação do python sobre o sono não especifica isso, no entanto, para que eu possa entender a confusão!
O encadeamento será bloqueado, mas o processo ainda está ativo.
Em um único aplicativo encadeado, isso significa que tudo fica bloqueado enquanto você dorme. Em um aplicativo multithread, apenas o encadeamento explicitamente 'suspenso' será bloqueado e os outros encadeamentos ainda serão executados no processo.
O processo não pode ser executado por si só. Em relação à execução, process é apenas um contêiner para threads. Ou seja, você não pode pausar o processo. Simplesmente não é aplicável ao processo.
sleep
comando fará uma pausa.
ele bloqueia um encadeamento se for executado no mesmo encadeamento e não se for executado a partir do código principal