- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
据我所知,系统中可以同时产生多个线程,但 2 个不同的线程不能同时访问或修改同一资源。我什至尝试过很多事情,例如创建多个线程并将它们放入队列等。但我过去总是听到人们说 Python 中不支持多线程,相反您可以使用多处理来利用多核 CPU。
我这是真的吗? Python线程只是绿色线程,不是真正的多线程吗?我对 Python 的资源锁定是否正确?
最佳答案
Python 中的多线程是一个神话。
从技术上讲,没有什么可以禁止多个线程同时尝试访问同一资源。结果通常是不理想的,所以开发了锁、互斥锁和资源管理器等东西。它们都是确保一次只有一个线程可以访问给定资源的不同方法。从本质上讲,它们使线程可以很好地协同工作。但是,如果线程的大量时间都花在了等待资源上,那么您就无法从多线程中获得任何好处,您最好还是编写一个单线程程序(或重构您的程序以避免等待) .
话虽这么说,在 CPython(最流行的 Python 实现 - 通过单击 https://python.org 上的下载按钮或通过包管理器获得的实现)中,有一种叫做 Global Interpreter Lock 的邪恶必需品。 (吉尔)。为了使 CPython 中的动态内存管理正常工作,GIL 防止多个线程同时运行 Python 代码。这是因为 CPython 的动态内存管理不是线程安全的——它可能会遇到多个线程同时访问(或更糟,处理)相同资源的问题。 GIL 是不允许多线程代码和动态内存管理非常庞大和缓慢这两个极端之间的折衷。
其他实现(如 Jython 和 IronPython ,但不包括 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/
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我的同事不断告诉我评论中列出的事情。 我很困惑。有人可以为我揭开这些东西的神秘面纱吗? class Bar { private int _a; public int A {
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我知道在JVM中,permgen区是用来存放类定义的。在我的 Tomcat 中,我看到 permgen 的当前内存使用量接近 100MB,似乎它只是随着时间的推移而增长,即使没有人使用 Tomcat
我是一名优秀的程序员,十分优秀!