在我的最佳知识中,可以同时在系统中产生多个线程,但是2个不同的线程无法同时访问或修改相同的资源。我什至尝试了很多事情,例如创建许多线程并将它们放在队列等中。但是我总是听到人们说多线程在Python中不可用,相反,您可以使用多处理来利用Multicore CPU。
。 。我是真的吗?Python线程仅仅是绿色线程,而不是真正的多线程吗?我对python的资源锁定是对的?
从技术上讲,没有任何禁止多个线程同时访问相同资源的线程。结果通常是不可取的,因此开发了锁,静音和资源经理之类的东西。它们都是确保仅一个线程一次访问给定资源的不同方法。从本质上讲,它们使线程在一起效果很好。但是,如果很多线程的时间都花在等待资源上,那么您将不会从多线程中获得任何好处,并且最好编写单线读取程序(或重组您的程序以避免等待((。
说,在cpython(最普遍的Python实现(中,您可以单击https://python.org上的下载按钮或通过软件包管理器获得的下载按钮,这是一个邪恶的必要性,称为全球解释器锁(吉尔(。为了使Cpython中的动态内存管理正确工作,GIL可以防止多个线程同时运行Python代码。这是因为CPYTHON的动态内存管理不是线程安全 - 它可以同时访问(或更糟糕的是,处置(相同资源的多个线程问题。GIL是不允许多线程代码的两个极端之间的折衷方案,并且使动态内存管理非常笨重和慢。
其他实现(例如Jython和Ironpython,但不是PYPY(没有GIL,因为它们建立的平台(Jython for Jython,.net,for Ironpython(的操作动态内存管理有所不同,因此可以安全地运行同时在多个线程中的Python代码。
如果您使用的是cpython,则强烈建议使用多处理模块。它没有运行多个线程,而是运行多个进程(每个过程都有自己的GIL,因此它们都可以同时运行(。它比多线程更有效。替代方法是将您的多线程代码编写为C/C 作为扩展名,因为本机代码不受GIL的约束。但是,这通常是更多的工作,而且收益通常不值得付出努力。
关于绿色线程:它们不会以通常的意义实现多线程。绿线更接近圆环,因为它们(通常(无法利用多个处理器核心以真正并行运行。取而代之的是,他们通常实现合作多任务处理,每个绿色线程都会手动将控制传递到另一个绿色线程。无固定的Python对绿色线进行了内置的支持,绿色扩展将它们带到Cpython。可能还有其他库/模块可以实现绿色线程,但是我不熟悉其他任何内容。
no,python确实具有多线程。实际上,它使用系统线程。问题在于它不能使用不仅仅是可用的内核之一。这是由于所谓的 gil (全局解释器锁定(。Python线程仍然适用于I/O绑定的任务,而不是CPU约束任务,这可能会导致僵局和比赛条件。许多Python库通过使用C扩展绕过GIL来解决此问题。当然,这都是Cpython的情况。
Python的核心开发人员之一就此非常有趣。
考虑并发,雷蒙德·赫廷格
现在您是对的,最好使用多处理来获取所有内核。但是,核心比有线程少得多。核心是宝贵的资源,并占用了很多记忆。如果您不介意处理IPC(Intercess Communication(,那么这是一个很好的解决方案。
必须考虑全局解释器锁(GIL(以回答您的问题。当创建更多的线程数(例如k(时,通常它们不会增加k时的性能,因为它仍将作为一个线程应用程序运行。GIL是一个全局锁,可以将所有内容锁定出来,并且仅允许仅利用单个核心的单个线程执行。在使用Numpy,网络,I/O之类的C扩展,完成了许多背景工作并释放GIL之类的C延长时,性能确实会提高。因此,当使用线程时,只有一个操作系统级线程,而Python创建了伪线程,这些伪线程完全通过线程来管理,但基本上是作为一个过程运行。在这些伪线之间进行抢先。如果CPU以最大容量运行,则可能需要切换到多处理。现在,如果执行执行实例,则可以选择池。但是,如果数据重叠的数据,您可能希望在其中进行交流的进程,则应使用multiprocessing.Process
。