python - 为什么非常小的 checkinterval 不会减慢 python3 中 CPU 密集型多线程的速度?

标签 python python-3.x cpython gil

from threading import Thread

def countdown(start, end):
    while end > start:
        end -= 1

def multi_thread(n):
    t1 = Thread(target=countdown, args=(0, n // 2))
    t2 = Thread(target=countdown, args=(n // 2, n))
    t1.start()
    t2.start()
    t1.join()
    t2.join()

if __name__ == '__main__':
    import timeit
    import sys

    sys.setswitchinterval(1)
    print(timeit.timeit("""import gil;gil.multi_thread(10000000);""", number=1))
    # 1.07s
    sys.setswitchinterval(0.001)
    print(timeit.timeit("""import gil;gil.multi_thread(10000000);""", number=1))
    # 1.09s

阅读 NewGIL.pdf 后,我认为小的间隔会导致更多的线程 sleep /唤醒操作,那么总的执行时间应该更长。我错了吗?

测试环境:四核Ubuntu16.04 python3.5。

最佳答案

请注意,您的总任务只需要大约 1 秒。因此,如果开关间隔为 0.001 秒,则总共只有大约 1/0.001 = 一千次开关。每次切换(“以 C 速度”发生)的成本更自然地以微秒而不是毫秒来衡量,因此与总的 1 秒耗时相比,一千个切换仍然便宜。

要查看更多效果,请尝试将切换间隔设置为 1e-6

在现实生活中,线程切换的真正成本通常是相关成本:线程获得足够的时间来填充硬件指令和数据缓存,然后被切换出去,新线程将遭受缓存的影响起初在各个级别上都有失误。您的示例没有任何这些成本(每个线程使用的代码和数据相对较小,并且两个线程的内容甚至可以同时放入 L1 缓存中)。

关于python - 为什么非常小的 checkinterval 不会减慢 python3 中 CPU 密集型多线程的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478859/

相关文章:

python - 如何从python中的unicode列表中删除特定元素

python - 为什么 CPython 预分配一些整数?

python - CPython的静态对象地址和碎片

python - 使用多处理读取、压缩、写入

python - 'google-api-python-client' distribution 在pyinstaller编译的running EXE上找不到

python - 在 plotly 表达动画中隐藏播放和停止按钮

python - import 是否在路径之前先查找当前工作目录?或者cwd的路径?

python - 集合.deque : why q[9999] is faster than q[-1]?

python - 如何将稀疏数据的PythonRDD转换为密集的PythonRDD

python - 在文件中查找大于 32KB 的零个 block