Time.sleep - спит нить или процесс?

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
379
0
264 900
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Просто нить.

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

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

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

@MichaelMrozek: sleep(3) говорит: "sleep () заставляет вызывающий поток спать до тех пор, пока не пройдут секунды секунды или не поступит сигнал, который не будет проигнорирован". и есть ошибка документации Python.

jfs 17.01.2015 07:02

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

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

Ответ принят как подходящий

Он блокирует поток. Если вы посмотрите в 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 01.08.2017 04:26

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

Nick Bastin 01.08.2017 05:32

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

akki 01.08.2017 08:55

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

Jeff Younker 20.10.2017 17:37

Второй ответ: его точка зрения заключается в том, что пока 'waiter ()' спит, 'worker' продолжает работать.

Jeff Younker 20.10.2017 17:39

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

gunit 02.12.2017 02:32

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

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

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

tripleee 15.10.2017 14:30

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

Denis The Menace 16.10.2017 20:25

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

Cort Ammon 19.08.2019 23:24

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

Другие вопросы по теме