Python中的线程处理效率如何?
我听说Python中的线程不是很有效(与其他语言相比)Python中的线程处理效率如何?,python,multithreading,Python,Multithreading,我听说Python中的线程不是很有效(与其他语言相比) 这是真的吗?如果是这样,Python程序员如何克服这一问题?一个选择是使用不同的Python实现,如Jython或IronPython。这样,您仍然可以获得使用Python语言而不必处理GIL的好处。但是,您无法使用仅限于CPython的库 另一种选择是使用不同于线程的构造。例如,如果使用Stackless 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的精彩演讲,以获得更深入的了解。