gpt4 book ai didi

python - 多处理多线程GIL?

转载 作者:行者123 更新时间:2023-12-03 13:14:59 24 4
gpt4 key购买 nike

因此,由于几天来,我对python上的多处理和多线程进行了大量研究,因此我对许多事情感到非常困惑。很多次,我看到有人在谈论GIL,但不允许Python代码在多个cpu内核上执行,但是当我编写一个创建多个线程的程序时,我可以看到多个cpu内核处于 Activity 状态。
第一个问题:什么是真正的GIL?它行得通吗?我想到的是某个进程在多cpu上创建太多线程的OS分布式任务时发生的事情。我对吗?
另一件事,我想利用我的cpus。我考虑的事情是创建与cpu核心一样多的进程,在此基础上,每个进程创建与cpu核心一样多的线程。我在正确的车道上吗?

最佳答案

首先,GIL仅确保在任何给定时间仅运行一条cpython字节码指令。它不关心哪个CPU内核运行指令。这就是OS内核的工作。
因此,仔细研究您的问题:

  • GIL只是一段代码。 CPython虚拟机是首先将代码编译为Cpython字节码的过程,但是正常的工作是解释CPython字节码。 GIL是一段代码,可确保无论运行多少线程,一次都可以运行一行字节码。 Cpython字节码指令是构成虚拟机堆栈的内容。因此,在某种程度上,GIL将确保在任何给定时间点只有一个线程持有GIL。 (同样,它会继续释放其他线程的GIL,而不会使它们饿死。)

  • 现在开始您的实际困惑。您提到过,当您运行带有多个线程的程序时,您会看到多个(可能是全部)CPU内核启动。因此,我做了一些实验,发现您的发现是正确的(很明显),但是在非线程版本中,行为也是相似的。
    def do_nothing(i):
    time.sleep(0.0001)
    return i*2

    ThreadPool(20).map(do_nothing, range(10000))
    def do_nothing(i):
    time.sleep(0.0001)
    return i*2

    [do_nothing(i) for i in range(10000)]
    第一个是多线程的,而第二个则不是。当您比较两个程序的CPU使用率时,您会发现在两种情况下都会启动多个CPU内核。因此,尽管注意到了,但您注意到的与GIL或线程无关。多个内核中的CPU使用率很高只是因为OS内核将根据可用性将代码的执行分配给不同的内核。
    您的最后一个问题更多是实验性的事情,因为不同的程序具有不同的CPU/io使用率。您只需要知道创建线程和进程的成本以及GIL和PVM的工作,并优化线程和进程的数量即可获得最大性能。
    您可以阅读David Beazley的 this talk,了解多线程如何使您的代码性能更差(或更好)。

    关于python - 多处理多线程GIL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63454072/

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