bin*_*.py 9 python multithreading multiprocessing
我是python中多线程代码的新手.根据我目前的知识,我知道可以在系统内同时生成多个线程,但是2个不同的线程不能同时访问或修改同一个资源.我甚至尝试过很多东西,比如创建很多线程并放入队列等等.但是我总是听到人们说多线程在python中不可用,而你可以使用多处理来利用多核.
请告诉我这是真的吗?python线程只是绿色线程而不是真正的多线程吗?我对python的资源锁定是对的吗?
先感谢您
不,Python确实有多线程.实际上,它使用系统线程.问题只是它不能使用多个可用内核.这是由于称为GIL(全局解释器锁)的东西.Python线程仍然适用于I/O绑定任务,而不是可能导致死锁和竞争条件的CPU绑定任务.许多Python库通过使用C扩展来绕过GIL来解决这个问题.当然,这就是CPython的情况.
Python的核心开发人员之一对此有一个非常有趣的讨论.
现在你是对的,使用多处理来获得所有核心的好处要好得多.但是核心比线程少得多.核心是宝贵的资源,占用大量内存.如果你不介意处理IPC(进程间通信),那么它是一个很好的解决方案.
小智 6
Python中的多线程是一个神话。
从技术上讲,没有什么可以禁止多个线程尝试同时访问同一资源。结果通常是不希望的,因此开发了诸如锁,互斥锁和资源管理器之类的东西。它们都是确保每次只有一个线程可以访问给定资源的不同方法。从本质上讲,它们使线程可以一起玩。但是,如果很多线程的时间都花在等待资源上,那么多线程并不会给您带来任何好处,因此最好编写一个单线程程序(或者重组程序以避免等待)。 。
话虽这么说,在CPython(最流行的Python实现-您通过单击https://python.org上的下载按钮或通过程序包管理器获得的实现)中,这种邪恶的需要称为Global Interpreter Lock(GIL)。为了使CPython中的动态内存管理正常工作,GIL阻止了多个线程同时运行Python代码。这是因为CPython的动态内存管理不是线程安全的-它可能会遇到多个线程同时访问(或更糟的是,分配)同一资源的相同问题。GIL是在不允许多线程代码和动态内存管理非常庞大且缓慢的两个极端之间的折衷。
其他实现(例如Jython和IronPython,但没有PyPy)没有GIL,因为它们构建的平台(用于Jython的Java,用于IronPython的.NET)以不同的方式处理动态内存管理,因此可以安全地运行Python代码在同一时间在多个线程中。
如果使用的是CPython,则强烈建议改用multiprocessing模块。它运行多个进程(而不是运行多个线程),而不是运行多个线程(每个进程都具有自己的GIL,因此它们可以同时运行)。它比多线程更有效。替代方法是使用C / C ++作为扩展来编写多线程代码,因为本机代码不受GIL的约束。但是,这通常需要做很多工作,因此付出的回报通常是不值得的。
关于绿色线程:通常情况下,它们不实现多线程。绿色线程更接近协程,因为它们(通常)无法利用多个处理器内核真正并行运行。相反,它们通常实现协作多任务处理,其中每个绿色线程将手动将控制权传递给另一个绿色线程。Stackless Python内置了对绿色线程的支持,并且greenlet扩展将其引入了CPython。可能还有其他实现绿色线程的库/模块,但是我对其他任何一个都不熟悉。
| 归档时间: |
|
| 查看次数: |
6604 次 |
| 最近记录: |