据我所知,系统中可以同时产生多个线程,但 2 个不同的线程不能同时访问或修改同一资源。我什至尝试过很多事情,比如创建多个线程并将它们放入队列等。但我以前总是听到人们说 Python 不支持多线程,相反你可以使用多处理来利用多核 CPU。
我这是真的吗? Python线程只是绿色线程,不是真正的多线程吗?我对 Python 的资源锁定是否正确?
原文由 binu.py 发布,翻译遵循 CC BY-SA 4.0 许可协议
据我所知,系统中可以同时产生多个线程,但 2 个不同的线程不能同时访问或修改同一资源。我什至尝试过很多事情,比如创建多个线程并将它们放入队列等。但我以前总是听到人们说 Python 不支持多线程,相反你可以使用多处理来利用多核 CPU。
我这是真的吗? Python线程只是绿色线程,不是真正的多线程吗?我对 Python 的资源锁定是否正确?
原文由 binu.py 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
Python 中的多线程有点像神话。
从技术上讲,没有什么可以禁止多个线程同时尝试访问同一资源。结果通常是不理想的,所以开发了锁、互斥锁和资源管理器等东西。它们都是确保一次只有一个线程可以访问给定资源的不同方法。从本质上讲,它们使线程可以很好地协同工作。但是,如果线程的大量时间都花在了等待资源上,那么您就无法从多线程中获得任何好处,您最好还是编写一个单线程程序(或重构您的程序以避免等待) .
话虽这么说,在 CPython(最流行的 Python 实现 - 通过单击 https://python.org 上的下载按钮或通过包管理器获得的实现)中,存在称为 全局解释器锁(GIL) 的邪恶必需品。为了使 CPython 中的动态内存管理正常工作,GIL 防止多个线程同时运行 Python 代码。这是因为 CPython 的动态内存管理不是线程安全的——它可能会遇到多个线程同时访问(或更糟,处理)相同资源的问题。 GIL 是不允许多线程代码和动态内存管理非常庞大和缓慢这两个极端之间的折衷。
其他实现(如 Jython 和 IronPython ,但不是 PyPy )没有 GIL,因为它们构建的平台(Jython 是 Java,IronPython 是 .NET)处理动态内存管理的方式不同,因此可以安全地运行 Python 代码同时在多个线程中。
如果您使用的是 CPython,强烈建议改用 多处理 模块。它不是运行多个线程,而是运行多个进程(每个进程都有自己的 GIL,因此它们可以同时运行)。它比多线程更有效。另一种方法是用 C/C++ 编写多线程代码作为扩展,因为本机代码不受 GIL 的约束。然而,这通常需要更多的工作,而且付出的努力通常得不偿失。
关于绿色线程:它们不实现通常意义上的多线程。 绿色线程 更接近 协程,因为它们(通常)不能利用多个处理器核心真正并行运行。相反,他们通常实施 协作式多任务处理,其中每个绿色线程将手动将控制权传递给另一个绿色线程。 Stackless Python 内置了对绿色线程的支持, greenlet 扩展将它们带到了 CPython。可能还有其他实现绿色线程的库/模块,但我对其他任何库/模块都不熟悉。