time.sleep - спит поток или процесс?


Ответы:


353

Это блокирует поток. Если вы загляните в Modules / timemodule.c в исходном коде Python, то увидите, что в вызове floatsleep()основная часть операции сна заключена в блок Py_BEGIN_ALLOW_THREADS и Py_END_ALLOW_THREADS, что позволяет другим потокам продолжать выполнение, пока текущий один спит. Вы также можете проверить это с помощью простой программы на 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()

Который напечатает:

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

3
Как иллюстрировать "поток" заблокирован. И почему бы не печатать только 5 и 103, а все остальные цифры? Было бы очень полезно для меня, если бы кто-то мог объяснить.
Akki

@akki: пожалуйста, задавайте новый вопрос, а не используйте комментарии к старому вопросу. Кроме того, 5 печатается (это прямо перед 101).
Ник Бастин

8
Открыть новый вопрос, чтобы спросить смысл этого ответа? Это кажется довольно странным для меня. И я имел в виду 11 (не 5), извините, не могу исправить мой комментарий сейчас. На самом деле мне нужна помощь, чтобы понять, какой смысл пытается ответить на этот вопрос.
Akki

Первый ответ: функция диапазона xrange (k, m) возвращает числа k включительно до m-1 включительно, поэтому список выражений (xrange (100, 103)) возвращает [100, 101, 102]. Это означает, что длина (list (xrange (k, m))) == m - k.
Джефф Юнкер,

3
akki, более конкретно, time.sleep () блокирует поток, который вызвал time.sleep (), но освобождает Python GIL для запуска других потоков (поэтому он не блокирует процесс). Пример Ника на самом деле не показывает блокировку потока, он больше показывает, что GIL освобождается (таким образом, показывая, что процесс НЕ заблокирован). Я думаю, что если бы у него было больше таких вещей, как оператор print после time.sleep (5) в потоке waiter (), это показало бы, что печать не произойдет до тех пор, пока не закончится time.sleep (5) (т.е. блокировка)
Gunit

52

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

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

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




13

Поток заблокируется, но процесс все еще жив.

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



2

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


А? Это может быть правдой для Windows или чего-то еще, но определенно не универсально. В Unix традиционно вообще не было потоков, и поэтому программа на Python запускает процесс (в каком-то абстрактном смысле с одним потоком), что и делает sleepкоманду, которая приостанавливает работу.
tripleee

Грустно вас разочаровывать, но в Windows и во всех системах * nix основной работающий модуль - это поток. Вы не можете запустить процесс без потоков. Если вы выходите из последнего потока, процесс прекращается.
Денис Угроза

Это не отвечает на вопрос. В частности, этот вопрос касается Python. Python имеет глобальную блокировку интерпретатора (GIL). Если бы поток перешел в спящий режим, удерживая GIL, он заблокировал бы все потоки Python в процессе, потому что все они разделяют одну и ту же блокировку.
Корт Аммон

1

он блокирует поток, если он выполняется в том же потоке, а не если он выполняется из основного кода

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.