gpt4 book ai didi

python - 为什么 time.sleep(...) 不受 GIL 的影响?

转载 作者:行者123 更新时间:2023-12-03 21:55:26 25 4
gpt4 key购买 nike

根据我在研究 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 秒?

最佳答案

马里奥的回答是一个很好的高级回答。如果您对如何实现的一些细节感兴趣:在 CPython 中,time.sleep 的实现包裹其 select系统调用 Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS :

https://github.com/python/cpython/blob/7ba1f75f3f02b4b50ac6d7e17d15e467afa36aac/Modules/timemodule.c#L1880-L1882

这些是在释放/获取 GIL 的同时保存和恢复线程状态的宏:

https://github.com/python/cpython/blob/7c59d7c9860cdbaf4a9c26c9142aebd3259d046e/Include/ceval.h#L86-L94
https://github.com/python/cpython/blob/4c9ea093cd752a6687864674d34250653653f743/Python/ceval.c#L498

关于python - 为什么 time.sleep(...) 不受 GIL 的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61809897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com