gpt4 book ai didi

python - 为什么在主线程死循环的情况下,在不同的线程导入模块需要很长时间?

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:50 24 4
gpt4 key购买 nike

我有以下 Python 代码:

import threading
from datetime import datetime
import time

def f():
print('---- {:%H:%M:%S}'.format(datetime.now()))
import http.server
print('---- {:%H:%M:%S}'.format(datetime.now()))

threading.Thread(target=f).start()

while True:
pass

当我执行它时,我发现import http.server 消耗了大量时间。正如您从以下输出中看到的那样,导入花费了 23 秒。

C:\>python foo.py
---- 10:12:03
---- 10:12:26

但是,如果我在无限的 while 循环中稍作休息,导入就会更快。

import threading
from datetime import datetime
import time

def f():
print('---- {:%H:%M:%S}'.format(datetime.now()))
import http.server
print('---- {:%H:%M:%S}'.format(datetime.now()))

threading.Thread(target=f).start()

while True:
time.sleep(1)

输出:

C:\>python foo.py
---- 10:15:58
---- 10:15:58

我知道 join() 方法的用法,但我想确切地知道为什么 import http.server 在无限 while 时需要这么长时间 循环中没有 sleep 语句。

最佳答案

CPython 使用全局解释器锁来保护解释器上下文。这可以防止线程同时运行。实际上它们都运行在单处理器内核上。在 CPython 中,当线程执行类似空闲的操作时,您可以从线程中受益,即等待 I.O。或监听套接字。
你为主线程做了很多工作。虽然 pass 没有做任何有趣的事情,但它会消耗 CPU 周期,而且解释器认为为该线程提供 CPU 时间很重要。
使用 sleep 你说 在时间到期之前不要为此线程浪费任何东西

关于python - 为什么在主线程死循环的情况下,在不同的线程导入模块需要很长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22628294/

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