Python中的线程效率如何?

web*_*at0 11 python multithreading

我听说Python中的线程效率不高(与其他语言相比).

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

Jes*_*hen 19

人们之所以说多线程在python中效率不高是因为Global Interpreter Lock.由于编写解释器的方式,只有一个线程可以同时安全地在解释器中执行代码.

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

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


nco*_*lan 9

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

在单核机器上,这无关紧要 - 无论如何,所有线程都是通过时间切片伪造的.在多核机器上,它有所不同:在CPython上运行的CPU绑定Python程序将不会使用所有可用内核.

对此有很多可能的回应:

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

如果线程被用于将阻塞IO转换为非阻塞操作,那么在标准CPython中可以正常工作而无需任何特殊修改 - IO操作已经释放了GIL.


tau*_*ran 6

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

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