time.sleep - dorme thread ou processo?

Respostas:

353

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
Nick Bastin
fonte
3
Como ilustra um "thread" foi bloqueado. E por que apenas 5 e 103 não são impressos, enquanto todos os outros números são impressos. Seria realmente útil para mim se alguém pudesse explicar.
akki
@akki: faça uma nova pergunta em vez de usar os comentários de uma pergunta antiga. Além disso, 5 é impresso (é um pouco antes da 101).
Nick Bastin
8
Abra uma nova pergunta para perguntar o significado desta resposta? Isso me parece muito estranho. E eu quis dizer 11 (não 5), desculpe, não posso corrigir meu comentário agora. Na verdade, preciso de ajuda para entender o que essa resposta está tentando mostrar.
akki
Primeira resposta: A função de intervalo xrange (k, m) retorna os números k inclusive até m-1 inclusive, portanto a lista de expressões (xrange (100, 103)) retorna [100, 101, 102]. Isso significa que o comprimento (list (xrange (k, m))) == m - k.
Jeff Younker
3
akki, Mais especificamente, time.sleep () bloqueia o thread chamado time.sleep (), mas libera o Python GIL para executar outros threads (para que não bloqueie o processo). O exemplo de Nick não mostrou realmente o bloqueio do encadeamento, mas mostrou que o GIL é liberado (mostrando assim que o processo NÃO está bloqueado). Eu acho que se ele tivesse mais coisas como uma declaração de impressão após o time.sleep (5) no segmento de garçom (), isso mostraria que a impressão não aconteceu até depois do time.sleep (5) terminar (ou seja, bloquear)
gunit
52

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!

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

Zach Burlingame
fonte
32

Apenas o fio.

finnw
fonte
13

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.

Corey Goldberg
fonte
3

Somente o encadeamento, a menos que seu processo tenha um único encadeamento.

Alifornia
fonte
2

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.

Denis The Menace
fonte
Hã? Isso pode ser verdade no Windows ou algo assim, mas certamente não universalmente. O Unix tradicionalmente não tinha threads e, portanto, um programa Python executa um processo (com uma única thread, em algum sentido abstrato), que é o que o sleepcomando fará uma pausa.
Tripleee 15/10
É triste desapontá-lo, mas no Windows e em todos os sistemas * nix a principal unidade em execução é um encadeamento. Você não pode executar o processo sem threads. Se você sair do último encadeamento, o processo será encerrado.
Denis The Menace
Isso não responde à pergunta. Em particular, esta pergunta é sobre Python. O Python possui um bloqueio global para intérpretes (GIL). Se um thread dormisse enquanto mantinha o GIL, ele bloquearia todos os threads do Python no processo, porque todos compartilham o mesmo bloqueio.
Cort Ammon
1

ele bloqueia um encadeamento se for executado no mesmo encadeamento e não se for executado a partir do código principal


fonte