gpt4 book ai didi

python - python中的多线程是一个神话吗?

转载 作者:太空狗 更新时间:2023-10-29 20:16:28 24 4
gpt4 key购买 nike

据我所知,系统中可以同时产生多个线程,但 2 个不同的线程不能同时访问或修改同一资源。我什至尝试过很多事情,例如创建多个线程并将它们放入队列等。但我过去总是听到人们说 Python 中不支持多线程,相反您可以使用多处理来利用多核 CPU。

我这是真的吗? Python线程只是绿色线程,不是真正的多线程吗?我对 Python 的资源锁定是否正确?

最佳答案

Python 中的多线程是一个神话。

从技术上讲,没有什么可以禁止多个线程同时尝试访问同一资源。结果通常是不理想的,所以开发了锁、互斥锁和资源管理器等东西。它们都是确保一次只有一个线程可以访问给定资源的不同方法。从本质上讲,它们使线程可以很好地协同工作。但是,如果线程的大量时间都花在了等待资源上,那么您就无法从多线程中获得任何好处,您最好还是编写一个单线程程序(或重构您的程序以避免等待) .

话虽这么说,在 CPython(最流行的 Python 实现 - 通过单击 https://python.org 上的下载按钮或通过包管理器获得的实现)中,有一种叫做 Global Interpreter Lock 的邪恶必需品。 (吉尔)。为了使 CPython 中的动态内存管理正常工作,GIL 防止多个线程同时运行 Python 代码。这是因为 CPython 的动态内存管理不是线程安全的——它可能会遇到多个线程同时访问(或更糟,处理)相同资源的问题。 GIL 是不允许多线程代码和动态内存管理非常庞大和缓慢这两个极端之间的折衷。

其他实现(如 JythonIronPython ,但不包括 PyPy )没有 GIL,因为它们构建的平台(Jython 的 Java,IronPython 的 .NET)处理动态内存管理的方式不同,因此可以同时在多个线程中安全地运行 Python 代码。

如果您使用的是 CPython,强烈建议使用 multiprocessing模块代替。它不是运行多个线程,而是运行多个进程(每个进程都有自己的 GIL,因此它们可以同时运行)。它比多线程更有效。另一种方法是用 C/C++ 编写多线程代码作为扩展,因为 native 代码不受 GIL 的约束。然而,这通常需要更多的工作,而且通常得不偿失。


关于绿色线程:它们不实现通常意义上的多线程。 Green threads更接近coroutines ,因为它们(通常)不能利用多个处理器内核真正并行运行。相反,他们通常实现 cooperative multitasking ,其中每个绿色线程将手动将控制权传递给另一个绿色线程。 Stackless Python内置了对绿色线程的支持,greenlet扩展将它们带到了 CPython。可能还有其他实现绿色线程的库/模块,但我对其他任何库/模块都不熟悉。

关于python - python中的多线程是一个神话吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44793371/

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