Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的线程处理效率如何?_Python_Multithreading - Fatal编程技术网

Python中的线程处理效率如何?

Python中的线程处理效率如何?,python,multithreading,Python,Multithreading,我听说Python中的线程不是很有效(与其他语言相比) 这是真的吗?如果是这样,Python程序员如何克服这一问题?一个选择是使用不同的Python实现,如Jython或IronPython。这样,您仍然可以获得使用Python语言而不必处理GIL的好处。但是,您无法使用仅限于CPython的库 另一种选择是使用不同于线程的构造。例如,如果使用Stackless Python,则是另一种选择。人们之所以说Python中的多线程不是很有效,是因为全局解释器锁。由于解释器的编写方式,只有一个线程可以

我听说Python中的线程不是很有效(与其他语言相比)


这是真的吗?如果是这样,Python程序员如何克服这一问题?

一个选择是使用不同的Python实现,如Jython或IronPython。这样,您仍然可以获得使用Python语言而不必处理GIL的好处。但是,您无法使用仅限于CPython的库


另一种选择是使用不同于线程的构造。例如,如果使用Stackless Python,则是另一种选择。

人们之所以说Python中的多线程不是很有效,是因为全局解释器锁。由于解释器的编写方式,只有一个线程可以同时在解释器中安全地执行代码

这意味着,如果您有大量计算受限的线程,也就是说,在解释器中执行大量工作,那么实际上仍然只有单线程程序的性能。在这种情况下,您最好使用多处理模块,该模块与多线程模块具有相同的接口,但会启动解释器的多个副本(缺点是您必须显式共享内存)


在python中,您仍然可以从多线程中获得速度增益的地方是,如果您正在做一些严重受限于IO的事情。当一个线程正在等待磁盘或网络i/o时,其他线程仍然可以执行,因为当线程阻塞时,它们会释放解释器锁。

您可以通过使用来克服这一问题!它与python中的多线程处理一样简单,但却为您提供了所有cpu核心的全部功能

多处理是一个包,它支持使用类似于线程模块的API生成进程。多处理包提供本地和远程并发,通过使用子进程而不是线程,有效地避开了全局解释器锁。因此,多处理模块允许程序员充分利用给定机器上的多个处理器。它同时在Unix和Windows上运行


CPython使用引用计数和循环垃圾收集器进行内存管理。为了实现这一点,它有一个称为“全局解释器锁”的机制,该机制保护引用计数系统以及所有其他解释器内部

在单核机器上,这并不重要——无论如何,所有线程都是通过时间切片伪造的。在多核机器上,这会产生不同:在CPython上运行的CPU绑定Python程序不会使用所有可用的内核

对此,有许多可能的回应:

  • 使用多个进程而不是多个线程(也为多台机器提供了未来的可扩展性,而不是一台机器中的不同内核)
  • 使用具有更多核友好的垃圾收集机制(如Jython、IronPython或PyPy)的Python实现
  • 将更密集的CPU操作移出C代码,并在进行计算时释放GIL(这样,即使在任何时候只有一个Python线程处于活动状态,C代码也可以在其他内核上运行)

如果使用线程将阻塞IO转换为非阻塞操作,则在标准CPython中运行良好,无需任何特殊修改-IO操作已释放GIL。

线程在CPython中是有效的,但线程不能在不同的处理器/内核上同时运行。这可能就是我的意思。只有在需要执行共享内存并发时,它才会影响您

其他Python实现没有这个问题。

在找到解决方案(如下)后,我想知道为什么Python仍然有线程类

from multiprocessing import Pool

def some_function(x):
    return x*x

Xs = [i for i in xrange(1, 1000)]      # make 1, 2, ..., 999, 1000

pool = Pool(processes=16)              # start 16 worker processes on 16 CPU
print pool.map(some_function, Xs)      # print out 

请注意,GIL仅存在于CPython中。您仍然可以使用IronPython之类的工具,而不会招致(那么多)使用线程的惩罚。我听说它非常有效。有人可以发布一些链接,指向python中多线程处理的问题/或非问题吗?关于线程和python,已经有很多问题了……因为
Thread
类和
Pool
类是用于两个不同的方面的。或者更糟糕的性能是单线程程序:请参阅Dave Beazley的精彩演讲,以获得更深入的了解。