Python time.sleep——休眠线程还是进程?

Python time.sleep——休眠线程还是进程?,python,multithreading,time,sleep,python-internals,Python,Multithreading,Time,Sleep,Python Internals,在Python for*nix中,time.sleep()是否阻止线程或进程?仅阻止线程。它将只休眠线程,除非应用程序只有一个线程,在这种情况下,它将休眠线程并有效地休眠进程 然而,关于睡眠的python文档并没有指定这一点,所以我当然可以理解这种混淆 线程将被阻塞,但进程仍处于活动状态 在单线程应用程序中,这意味着在睡眠时所有内容都被阻塞。在多线程应用程序中,只有显式“睡眠”的线程才会被阻止,而其他线程仍在进程中运行。它会阻止线程。如果查看Python源代码中的Modules/timemodu

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

仅阻止线程。

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

然而,关于睡眠的python文档并没有指定这一点,所以我当然可以理解这种混淆


线程将被阻塞,但进程仍处于活动状态


在单线程应用程序中,这意味着在睡眠时所有内容都被阻塞。在多线程应用程序中,只有显式“睡眠”的线程才会被阻止,而其他线程仍在进程中运行。

它会阻止线程。如果查看Python源代码中的Modules/timemodule.c,您将看到在对
floatsleep()
的调用中,睡眠操作的实质部分被包装在Py_BEGIN_ALLOW_线程和Py_END_ALLOW_线程块中,允许其他线程在当前线程睡眠时继续执行。您还可以使用一个简单的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

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

进程本身无法运行。就执行而言,进程只是线程的容器。这意味着你根本不能暂停这个过程。它根本不适用于进程。

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

@MichaelMrozek:And。如何说明“线程”已被阻止。为什么不只打印5和103,而打印所有其他数字呢。如果有人能给我解释的话,那对我真的很有帮助。@akki:请问一个新问题,而不要用老问题的评论。另外,5会被打印出来(就在101之前)。打开一个新问题来问这个答案的意思?我觉得这很奇怪。我的意思是11(不是5),抱歉,现在无法更正我的评论。事实上,我需要一些帮助来理解这个答案的意图。第一个答案:range函数xrange(k,m)返回k到m-1,所以表达式列表(xrange(100103))返回[100101102]。这意味着length(list(xrange(k,m))==m-k.akki,更具体地说,time.sleep()会阻止调用time.sleep()的线程,但它会释放Python GIL以运行其他线程(因此不会阻止进程)。Nick的示例并没有真正显示线程的阻塞,它更多地显示了GIL被释放(从而表明进程没有被阻塞)。我想如果他在一段时间后有更多的东西,比如打印声明。在服务员()线程中睡眠(5),这将表明打印直到时间之后才发生。睡眠(5)完成(即阻塞)嗯?这在Windows或其他系统上可能是正确的,但肯定不是普遍的。Unix传统上根本没有线程,因此Python程序运行一个进程(从某种抽象意义上说,只有一个线程),而
sleep
命令将暂停该进程。令人遗憾的是,在Windows和所有*nix系统上,主运行单元是线程。您不能运行没有线程的进程。如果退出最后一个线程,进程将终止。这并不能回答问题。特别是,这个问题是关于Python的。Python有一个全局解释器锁(GIL)。如果一个线程在持有GIL时进入睡眠状态,它将阻止进程中的所有Python线程,因为它们都共享同一个锁。