399

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

4

7 回答 7

396

它阻塞了线程。如果您查看 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
于 2008-09-18T14:42:23.020 回答
58

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

然而, python 文档sleep()并没有具体说明这一点,所以我当然可以理解这种混乱!

于 2008-09-18T14:22:52.677 回答
36

只是线程。

于 2008-09-18T14:18:51.813 回答
17

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

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

于 2008-09-18T14:32:45.787 回答
4

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

于 2015-08-26T00:21:35.043 回答
3

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

于 2016-10-28T21:24:44.433 回答
1

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

于 2020-01-20T10:57:32.940 回答