2008-09-18 5 views

ответ

268

Он блокирует нить. Если вы посмотрите в модулях/timemodule.c в источнике Python, вы увидите, что в вызове floatsleep() основная часть операции сна заверяется в блок Py_BEGIN_ALLOW_THREADS и Py_END_ALLOW_THREADS, позволяя другим потокам продолжать выполнение, в то время как текущий спит. Вы также можете проверить это с помощью простой программы питона:

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() 

Что напечатает:

>>> thread_test.run() 
0 
100 
>>> 1 
2 
3 
4 
5 
101 
6 
7 
8 
9 
10 
102 
+0

Как проиллюстрировать «поток» заблокирован. И почему не печатаются не только 5 и 103, а все остальные цифры печатаются. Было бы очень полезно для меня, если бы кто-нибудь мог объяснить. – akki 2017-08-01 01:26:11

+0

@akki: задайте новый вопрос, а не используйте комментарии по старому вопросу. Кроме того, 5 печатаются (это прямо перед 101). – 2017-08-01 02:32:28

39

Он будет просто спать в потоке, за исключением случаев, когда ваше приложение имеет только один поток, и в этом случае он будет спать в потоке и эффективно выполнять этот процесс.

Документация на python во сне не указывает это, однако, я могу, конечно, понять путаницу!

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

+2

@MichaelMrozek: [`sleep (3)` говорит: * "sleep() заставляет сбой вызывающего потока до тех пор, пока не истечет секунды секунд или не поступит сигнал , который не игнорируется." *] (Http: // man7. org/linux/man-pages/man3/sleep.3.html) И [есть ошибка документации Python] (http://bugs.python.org/issue23251). – jfs 2015-01-17 04:02:35

8

Нить будет блокировать, но процесс все еще жив.

В однопоточном приложении это означает, что во время сна вы заблокированы. В многопоточном приложении только поток, который вы явно «спящий», блокируется, а остальные потоки все еще выполняются внутри процесса.

1

только нить, если ваш процесс не имеет ни одного потока.

1

Процесс не запускается сам по себе. Что касается исполнения, процесс - это просто контейнер для потоков. Это означает, что вы не можете приостановить процесс вообще. Это просто неприменимо к процессу.