Python 多线程

发布时间: 更新时间: 总字数:896 阅读时间:2m 作者: 分享 复制网址

Python 多线程实现方式

介绍

  • Python 的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核
  • GIL是Python解释器设计的历史遗留问题,通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。所以,在Python中,可以使用多线程,但不要指望能有效利用多核
  • 协程(Coroutine)
    • coroutines是线性处理的,同一时间只有一个coroutine在执行。
    • subroutine是coroutine的特例
    • subroutine只返回一次,并且不保存调用别人后不保存状态,相反,coroutine保存状态,coroutine可以调用coroutine,是通过yield的方式
    • 设计一个支持subroutine的语言只需要预分配一个stack即可,对应的,要支持coroutine的话,就需要预分配多个stack
    • coroutine有什么用?以producer和consumer为例,用coroutines会相当高效,都不需要底层thread切换,也不需要经过OS的公共资源,而是直接coroutine间调用就搞定了。
  • green thread 是由vm管理的,不是OS管理的,green threads 是仿真了多线程环境,不依赖与底层的OS,是运行在 user space 下。
    • 在多核处理器下,native thread 可以自动分配到多核去,而green thread不行
    • java 1.1中,green thread是唯一的线程模型,由于green thread比native thread有很多不足,java后续版本抛弃了green thread
    • python中的 eventlet 是green thread

实现

  • ThreadLocal的好处是让线程有了自己的空间,而不用全局共享的,同时又避免了作为参数传来传去。

  • multiprocessing

    • 多进程比多线程稳定些,因为多线程如果其中一个线程有问题,有可能导致整个进程有问题
  • threadpool

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数