time.sleep - dorme thread ou processo?
-
01-07-2019 - |
Pergunta
Em Python para * nix, faz bloco time.sleep()
o fio ou o processo?
Solução
Ele bloqueia o segmento. Se você olhar em módulos / timemodule.c na fonte Python, você verá que na chamada para floatsleep()
, a parte substantiva da operação sono está envolto em um bloco Py_BEGIN_ALLOW_THREADS e Py_END_ALLOW_THREADS, permitindo que outros segmentos para continuar a executar enquanto a atual dorme. Você também pode testar isso com um programa de python simples:
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
Outras dicas
Ela só vai dormir o fio, exceto no caso em que a sua aplicação tem apenas um único segmento, caso em que ele vai dormir o fio e eficazmente o processo também.
A documentação python no sono não especificar isso, porém, assim que eu posso certamente entender a confusão!
Apenas o segmento.
O fio irá bloquear, mas o processo ainda está vivo.
Em uma única aplicação de rosca, isso significa que tudo está bloqueado enquanto você dorme. Em um aplicativo com vários segmentos, somente o segmento que você explicitamente 'dormir' irá bloquear e outros tópicos continuam a correr dentro do processo.
Apenas o segmento a menos que o processo tem um único segmento.
O processo não é executável por si só. No que diz respeito à execução, o processo é apenas um recipiente para threads. Ou seja, você não pode pausar o processo em tudo. Ele simplesmente não é aplicável a processo.