time.sleep —休眠线程或进程?


Answers:


353

它阻塞线程。如果在Python源代码中查看Modules / timemodule.c,您会看到在调用中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,因此表达式list(xrange(100,103))返回[100,101,102]。这意味着length(list(xrange(k,m)))== m-k。
杰夫·尤尼克

3
akki,更具体地说,time.sleep()阻止了名为time.sleep()的线程,但它释放了Python GIL以运行其他线程(因此它不会阻止进程)。Nick的示例并没有真正显示线程的阻塞,而是显示了GIL已释放(因此表明该进程未被阻塞)。我认为,如果他在waiter()线程中的time.sleep(5)之后有更多类似打印语句的内容,那将表明直到time.sleep(5)完成(即阻塞)之后才进行打印
gunit

52

它只会休眠线程,除非您的应用程序只有一个线程,在这种情况下,它将休眠线程并有效地进程。

睡眠中的python文档未指定此内容,因此我当然可以理解混淆!

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




13

该线程将阻塞,但是该进程仍然有效。

在单线程应用程序中,这意味着您在睡眠时一切都被阻止了。在多线程应用程序中,只有您显式“睡眠”的线程将被阻塞,其他线程仍在进程中运行。


3

只有线程,除非您的进程具有单个线程。


2

进程本身无法运行。关于执行,进程只是线程的容器。这意味着您根本无法暂停该过程。它根本不适用于过程。


??在Windows之类的平台上可能是正确的,但肯定不是普遍的。Unix传统上根本没有线程,因此Python程序运行一个进程(从某种意义上讲,它具有单个线程),该进程sleep将暂停该命令。
三点

悲伤让你失望,但在Windows和所有的* nix系统的主要运行单元是一个线程。没有线程就无法运行进程。如果退出最后一个线程,则进程终止。
丹尼斯威胁

这不能回答问题。特别是,这个问题与Python有关。Python具有全局解释器锁(GIL)。如果线程在持有GIL的同时进入睡眠状态,则它将阻塞进程中的所有Python线程,因为它们都共享相同的锁。
科特·阿蒙

1

如果它在同一线程中执行,则它将阻塞一个线程,如果不是从主代码中执行,则它将阻塞该线程

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.