当前位置:  开发笔记 > 编程语言 > 正文

time.sleep - 睡眠线程还是进程?

如何解决《time.sleep-睡眠线程还是进程?》经验,为你挑选了4个好方法。

在Python for*nix中,是否会time.sleep()阻塞线程或进程?



1> Nick Bastin..:

它会阻止线程.如果查看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


打开一个新问题来询问这个答案的含义?这对我来说似乎很奇怪.我的意思是11(不是5),抱歉现在无法纠正我的评论.我实际上需要一些帮助来理解这个答案试图提出的要点.
如何说明“线程”已被阻塞。为什么不只打印5和103,而其他所有数字都不会打印呢?如果有人可以解释的话,对我真的很有帮助。
akki,更具体地说,time.sleep()阻止了名为time.sleep()的线程,但它释放了Python GIL以运行其他线程(因此它不会阻止进程)。Nick的示例并未真正显示线程的阻塞,而是表明GIL已释放(因此表明该进程未阻塞)。我认为,如果他在waiter()线程中的time.sleep(5)之后有更多类似打印语句的内容,那将表明直到time.sleep(5)完成(即阻塞)之后才进行打印

2> Zach Burling..:

除了你的应用程序只有一个线程的情况之外,它只会睡眠线程,在这种情况下它将睡眠线程并有效地处理该过程.

关于睡眠的python文档并没有指定这个,所以我当然可以理解这种混乱!

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


@MichaelMrozek:[`sleep(3)`说:*"sleep()使调用线程休眠直到秒秒已经过去或信号到达而不被忽略."*](http://man7.org/linux/ man-pages/man3/sleep.3.html)[有Python文档错误](http://bugs.python.org/issue23251).

3> finnw..:

只是线程.



4> Corey Goldbe..:

线程将阻塞,但进程仍然存在.

在单线程应用程序中,这意味着在您睡觉时一切都被阻止.在多线程应用程序中,只有您明确"睡眠"的线程才会阻塞,而其他线程仍在该进程中运行.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有