В Python для * nix time.sleep() блокирует поток или процесс?






Просто нить.
Он просто будет засыпать поток, за исключением случая, когда ваше приложение имеет только один поток, и в этом случае оно будет спать потоком, а также, по сути, процессом.
Однако документация python о сне не указывает этого, поэтому я могу понять путаницу!
http://docs.python.org/2/library/time.html
Поток будет заблокирован, но процесс все еще жив.
В однопоточном приложении это означает, что все заблокировано, пока вы спите. В многопоточном приложении только поток, который вы явно «спите», будет заблокирован, а другие потоки по-прежнему будут выполняться внутри процесса.
Он блокирует поток. Если вы посмотрите в 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
Как проиллюстрировать, что «поток» заблокирован. И почему бы не напечатать только 5 и 103, а все остальные числа напечатать. Было бы очень полезно для меня, если бы кто-нибудь мог объяснить.
@akki: пожалуйста, задавайте новый вопрос, а не используйте комментарии к старому вопросу. Также печатается 5 (это прямо перед 101).
Откройте новый вопрос, чтобы узнать значение этого ответа? Мне это кажется довольно странным. Я имел в виду 11 (а не 5), извините, не могу исправить свой комментарий сейчас. Мне действительно нужна помощь, чтобы понять, какой смысл пытается донести этот ответ.
Первый ответ: функция диапазона xrange (k, m) возвращает числа от k включительно до m-1 включительно, поэтому список выражений (xrange (100, 103)) возвращает [100, 101, 102]. Это означает, что length (list (xrange (k, m))) == m - k.
Второй ответ: его точка зрения заключается в том, что пока 'waiter ()' спит, 'worker' продолжает работать.
akki, Точнее, time.sleep () блокирует поток, который вызвал time.sleep (), но освобождает Python GIL для запуска других потоков (поэтому он не блокирует процесс). Пример Ника на самом деле не показывает блокировку потока, он больше показывает, что GIL выпущен (таким образом показывая, что процесс НЕ заблокирован). Я думаю, что если бы у него было больше таких вещей, как оператор печати после time.sleep (5) в потоке waiter (), это показало бы, что печать не происходила до тех пор, пока time.sleep (5) не завершился (т.е. блокировка)
Только поток, если ваш процесс не имеет единственного потока.
Процесс не запускается сам по себе. Что касается выполнения, процесс - это просто контейнер для потоков. Это означает, что вы вообще не можете приостанавливать процесс. Это просто не применимо к процессу.
Хм? Это может быть верно для Windows или чего-то еще, но не всегда. В Unix обычно не было потоков вообще, поэтому программа Python запускает процесс (с одним потоком в некотором абстрактном смысле), который команда sleep приостанавливает.
К сожалению, вас разочаровал, но в Windows и во всех системах * nix основной работающей единицей является поток. Вы не можете запустить процесс без потоков. Если вы выйдете из последнего потока, процесс завершится.
Это не ответ на вопрос. В частности, это вопрос о Python. Python имеет глобальную блокировку интерпретатора (GIL). Если поток перейдет в спящий режим, удерживая GIL, он заблокирует все потоки Python в процессе, потому что все они имеют одну и ту же блокировку.
он блокирует поток, если он выполняется в том же потоке, а не из основного кода
@MichaelMrozek:
sleep(3)говорит: "sleep () заставляет вызывающий поток спать до тех пор, пока не пройдут секунды секунды или не поступит сигнал, который не будет проигнорирован". и есть ошибка документации Python.