V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
northisland
V2EX  ›  问与答

怎么看 Python 运行多线程时的 GIL,这东西是 Python“伪多线程”的死穴么?

  •  
  •   northisland · 2016-08-01 08:47:18 +08:00 · 2833 次点击
    这是一个创建于 3045 天前的主题,其中的信息可能已经有所发展或是发生改变。
    说点看书的体会,欢迎讨论~



    Python 白皮儿书——《 Python 核心编程第二版》,里讲:


    对 Python 虚拟机的访问由全局解释器锁( Global Interpreter Lock , GIL )来控制,正式这个锁,能保证同一时刻只有一个线程运行。
    "

    看完 18.3.1 ,感觉, Python 代码不能实现多个 CPU 共同快跑,只能一次运行一个线程,虽然开了多个线程,但 GIL 强制一次只执行一个(做爬虫的同事说, Python 爬虫只能让一个 CPU 吃饱,和其他 CPU 无关)

    换言之, Python 是把多线程的执行模型,强行退化到 1 个 CPU ,退化到流水线处理模式。


    但是, 18.3.1 最后一段,的意思,我的理解是:
    这种 Python “多线程”,会让 I/O 操作在阻塞时间内,通过 GIL 切换到其他线程。
    所以,对某些界面操作,硬件调用,是有用的。
    但纯用 Python 代码,想完成计算方向的并行,是没有卵用的。




    6 条回复    2016-08-01 15:17:56 +08:00
    virusdefender
        1
    virusdefender  
       2016-08-01 09:31:36 +08:00
    IO 密集型使用多线程

    CPU 密集型使用多进程
    tabris17
        2
    tabris17  
       2016-08-01 09:38:16 +08:00
    Python 的多线程意义在于:在等待 IO 的时候可以让 CPU 去执行别的代码
    Tinet
        3
    Tinet  
       2016-08-01 09:40:37 +08:00
    “这种 Python “多线程”,会让 I/O 操作在阻塞时间内,通过 GIL 切换到其他线程。”

    感觉这个跟协程的调度很像啊
    ryd994
        4
    ryd994  
       2016-08-01 09:47:46 +08:00 via Android
    其实对于纯 C 的部分, GIL 是不影响的,所以也可以写个多线程的 C 模块
    lammps
    Arnie97
        5
    Arnie97  
       2016-08-01 13:50:56 +08:00 via Android
    “并发”不代表“并行”。计算密集型应用要另寻他法,比如多进程。
    northisland
        6
    northisland  
    OP
       2016-08-01 15:17:56 +08:00
    @Arnie97
    @virusdefender

    有什么 Python 多进程方面的资料么?多谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4120 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:17 · PVG 13:17 · LAX 21:17 · JFK 00:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.