【问题标题】:time.sleep -- sleeps thread or process?time.sleep -- 休眠线程或进程?
【发布时间】:2010-09-10 17:05:41
【问题描述】:

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

【问题讨论】:

    标签: python multithreading time sleep python-internals


    【解决方案1】:

    它阻塞了线程。如果您查看 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
    

    【讨论】:

    • 如何说明“线程”已被阻塞。为什么不只打印 5 和 103,而打印所有其他数字。如果有人能解释一下,对我真的很有帮助。
    • @akki:请提出一个新问题,而不是使用旧问题的 cmets。此外,还打印了 5(就在 101 之前)。
    • 开一个新问题问这个答案的意思?这对我来说似乎很奇怪。我的意思是 11(不是 5),抱歉现在不能更正我的评论。我实际上需要一些帮助来理解这个答案试图说明什么。
    • 第一个答案:范围函数 xrange(k, m) 返回从 k 到 m-1 的数字,所以表达式 list(xrange(100, 103)) 返回 [100, 101, 102]。这意味着 length(list(xrange(k, m))) == m - k.
    • akki,更具体地说,time.sleep() 会阻塞调用 time.sleep() 的线程,但它会释放 Python GIL 以运行其他线程(因此它不会阻塞进程)。 Nick 的例子并没有真正显示线程的阻塞,它更多地显示了 GIL 被释放(从而表明进程没有被阻塞)。我认为如果他在 waiter() 线程中的 time.sleep(5) 之后有更多的东西,比如打印语句,这将表明打印直到 time.sleep(5) 完成之后才发生(即阻塞)
    【解决方案2】:

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

    sleep() 上的 python 文档没有说明这一点,所以我当然可以理解其中的困惑!

    【解决方案3】:

    只是线程。

    【讨论】:

      【解决方案4】:

      线程会阻塞,但进程还活着。

      在单线程应用程序中,这意味着在您睡觉时一切都被阻塞。在多线程应用程序中,只有您明确“休眠”的线程会阻塞,其他线程仍在进程中运行。

      【讨论】:

        【解决方案5】:

        只有线程,除非你的进程有一个线程。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 嗯?这在 Windows 或其他东西上可能是正确的,但肯定不是普遍的。 Unix 传统上根本没有线程,因此 Python 程序运行一个进程(在某种抽象意义上,只有一个线程),这就是 sleep 命令将暂停的内容。
          • 很遗憾让您失望了,但在 Windows 和所有 *nix 系统上,主要运行单元是线程。没有线程就无法运行进程。如果退出最后一个线程,则进程终止。
          • 这没有回答问题。特别是,这个问题是关于 Python 的。 Python 有一个全局解释器锁 (GIL)。如果一个线程在持有 GIL 时进入睡眠状态,它将阻塞进程中的所有 Python 线程,因为它们都共享同一个锁。
          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2010-12-08
            • 1970-01-01
            • 2011-09-18
            • 1970-01-01
            • 2011-06-01
            • 2020-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多