【发布时间】:2020-05-15 00:54:25
【问题描述】:
根据我在研究 Python GIL 时的理解,一次只能执行一个线程(谁持有锁)。但是,如果这是真的,那为什么这段代码只需要 3 秒而不是 15 秒来执行呢?
import threading
import time
def worker():
"""thread worker function"""
time.sleep(3)
print 'Worker'
for i in range(5):
t = threading.Thread(target=worker)
t.start()
根据对线程的直觉,我原以为这需要 3 秒,但确实如此。但是在了解了 GIL 并且可以一次执行一个线程之后,现在我看这段代码并想,为什么不需要 15 秒?
【问题讨论】:
-
我认为
sleep()确实发布了 GIL。此外,Python 会强制每 N 毫秒或在执行 M 字节码指令后(取决于使用的 Python 版本)进行一次线程切换。 -
@martineau 如果这是真的,“等待”发生在哪里?
-
我认为线程最终会并行等待。
-
休眠线程没有执行。 5 个线程同时休眠不是同时执行。