喜闻乐见的去掉 GIL 的两篇文章 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
est
V2EX    Python

喜闻乐见的去掉 GIL 的两篇文章

  •  
  •   est
    est 2018-05-26 18:08:09 +08:00 7577 次点击
    这是一个创建于 2748 天前的主题,其中的信息可能已经有所发展或是发生改变。
    41 条回复    2018-05-30 12:58:27 +08:00
    kslr
        1
    kslr  
       2018-05-26 18:50:11 +08:00
    啊,这糟糕的 python 我已经自废右手换仿生 nodejs 了
    jimages
        2
    jimages  
       2018-05-26 19:09:00 +08:00
    所以就是雷声大雨点小。
    jimages
        3
    jimages  
       2018-05-26 19:10:37 +08:00   1
    想要去掉 GIL 而做到向下兼容是不可能的,只有再等 python4 了........
    Cbdy
        4
    Cbdy  
       2018-05-26 19:48:25 +08:00 via Android
    @jimages 搞不好 py4 又和 py3 不兼容,这就完彻了
    pathbox
        5
    pathbox  
       2018-05-26 20:14:06 +08:00 via iPhone
    想去 没搞个大动静很难吧
    est
        6
    est  
    OP
       2018-05-27 00:00:21 +08:00
    @kslr nodejs 压根就不支持原生线程。GIL 也就无从谈起。
    @Cbdy 文章里有写。python 3.8 计划搞一搞。2018 年 8 月发版。
    blackjar
        7
    blackjar  
       2018-05-27 00:01:24 +08:00
    那么多解释器 换一个用啊 或者大佬自己写一个好了
    copie
        8
    copie  
       2018-05-27 00:18:32 +08:00 via Android
    @jimages 不是说 Python 这门语言是不需要 GIL 的吗?
    GIL 是 Python 解释器实现的锅,自认为没有兼容性问题。个人推测
    est
        9
    est  
    OP
       2018-05-27 00:53:09 +08:00
    @copie Python 标准里的确没有规定必须用 GIL。CPython 的 GIL 是绕不过去的。 然而大多数生态都是围绕 CPython 的。所以然并卵。除非你用纯 Py 不依赖任何第三方库。
    neoblackcap
        10
    neoblackcap  
       2018-05-27 01:04:44 +08:00
    @est 其实按 GraalVM 的思路是可以的,Python 实际运行的是 GraalVM 的字节码,至于 C 扩展,编译成 LLVM IR,也是又 GraalVM 运行,这样就可以做到底层的都是字节码,而上层不变。
    est
        11
    est  
    OP
       2018-05-27 01:09:44 +08:00
    @neoblackcap 好像没那么简单。很多 C 扩展依赖特定的 ref counting 内存 allocate 机制。比如 numpy。
    neoblackcap
        12
    neoblackcap  
       2018-05-27 01:28:19 +08:00   1
    @est 依赖特定实现的行为都是异端,哎~,这样的没法说。
    blless
        13
    blless  
       2018-05-27 01:49:09 +08:00 via Android
    pypy 不是有一个无 GIL 版本?
    blless
        14
    blless  
       2018-05-27 01:56:16 +08:00 via Android
    RqPS6rhmP3Nyn3Tm
        15
    RqPS6rhmP3Nyn3Tm  
       2018-05-27 02:02:33 +08:00 via iPhone   3
    一个古老的笑话
    python 是一个双管猎枪,但是一次只能发射一颗子弹
    orangeade
        16
    orangeade  
       2018-05-27 02:18:31 +08:00 via Android
    @kslr js 语法不更糟糕,还有弱类型,
    性能这一块确实不行,毕竟没有大金主
    kslr
        17
    kslr  
       2018-05-27 02:22:27 +08:00 via Android
    @orangeade 那也比 python 半死不活的好
    qsnow6
        18
    qsnow6  
       2018-05-27 02:33:51 +08:00 via iPhone
    有协程就行了 GIL 没有去的必要
    Arnie97
        19
    Arnie97  
       2018-05-27 02:36:42 +08:00 via Android
    @orangeade 现在有编译到 JS 的语言试图弥补一部分坑,例如 TypeScript
    PythonAnswer
        20
    PythonAnswer  
       2018-05-27 03:10:37 +08:00 via iPhone
    还不如多花点精力提高解释器在其他方面的速度
    ericls
        21
    ericls  
       2018-05-27 04:25:48 +08:00 via iPhone
    @kslr what?
    copie
        22
    copie  
       2018-05-27 05:07:59 +08:00 via Android
    @est 是我疏忽了 把 Python 的大特点忘了
    lrxiao
        23
    lrxiao  
       2018-05-27 05:08:53 +08:00
    Gilectomy 我记得是我上次翻 PyCon2015/16 看到了 然后查了下就一直没有更新了,作者也是个学生也没得到 CPython 支持 PyPy 不是筹钱搞了下

    现在活了吗
    owenliang
        24
    owenliang  
       2018-05-27 09:42:06 +08:00 via Android
    一个工具性质的语言,非得全能。
        25
    diggerdu  
       2018-05-27 10:00:43 +08:00 via iPhone
    没必要,真要是运算密集,为什么不用 multiprocessing 呢
    eriale
        26
    eriale  
       2018-05-27 10:18:32 +08:00
    目前 python web 开发中,要么是 prefork 的方式,要么是 async 的模式,这两种应对现在流行的微服务都有问题。
    前者可以有效利用多核,但是在发生远程调用会把当前 worker 卡住。
    后者无法有效利用多核,而且还要有好用的 http/rpc 请求库,包括 requests 也是要在 3.0 版本才支持 async,总而言之,目前异步请求库还不成熟。
    如果去掉了 GIL,那就可以用线程池的方式,每个请求使用不同的线程处理,这样既可以利用多核 cpu,也可以利用底层的线程调度机制在发生微服务请求时自动切换线程。

    当然,我最疑惑的是老项目里的代码怎么办,以前写代码很少考虑线程安全问题,如果去掉 GIL,搞不好很多代码就有问题了,而且不光是自己写的代码,使用的很多第三方库估计也会有多线程问题。
    est
        27
    est  
    OP
       2018-05-27 10:35:23 +08:00
    @eriale 可以 prefork 出来多个 async 的 worker 进程。23333
    est
        28
    est  
    OP
       2018-05-27 10:43:06 +08:00
    @eriale 线程池其实做 IO 性能并不高。async 或者 gevent 可以轻松打到几千个协程,多线程就跪了。

    一般线程池是用来做 accept() 解决高并发的。不过然并卵 Linux 内核的 epoll 在多核下有惊群问题。
    orangeade
        29
    orangeade  
       2018-05-27 13:26:50 +08:00 via Android
    @kslr 算了吧,nodejs 不照样半死不活,js 专心写前端就好了
    lolizeppelin
        30
    lolizeppelin  
       2018-05-27 13:58:31 +08:00 via Android
    js 也好意思 233

    其实现在多线程问题对 Python 也没那么重要
    高并发肯定分布式 分布式肯定跨机器
    都跨机器了 。干脆也就只看多进程写法就是

    提升一下 Python 本身的性能比解决 gil 锁更有用
    est
        31
    est  
    OP
       2018-05-27 14:23:20 +08:00
    @lolizeppelin 其实我也这么觉得。如果用 C 写扩展可以自己管理线程,完全绕过 Cpython。
    laike9m
        32
    laike9m  
       2018-05-27 14:28:38 +08:00
    向 Larry Hastings 致敬!
    如果 BDFL 是他而不是 Guido,估计 Python 早就把这事搞定了
    jiang42
        33
    jiang42  
       2018-05-27 14:33:41 +08:00 via iPhone
    相对于去掉 GIL,我觉得改善 startup time 和单核单线程性能会比较重要……
    XIVN1987
        34
    XIVN1987  
       2018-05-27 14:39:32 +08:00 via Android
    @kslr
    python 现在明明是如日中天,最火的时候
    linkermlin
        35
    linkermlin  
       2018-05-27 14:47:28 +08:00
    提升性能的话,Cython 编译提升的最多。
    tkmiles
        36
    tkmiles  
       2018-05-29 10:27:53 +08:00
    @est epoll 的多核惊群? 能具体一点吗?我怎么记得 epoll 中内核已经解决了惊群了
    est
        37
    est  
    OP
       2018-05-29 10:44:19 +08:00   1
    @tkmiles accept() 有惊群。https://idea.popcount.org/2017-02-20-epoll-is-fundamentally-broken-12/

    Google 专门搞了个 SO_REUSEPORT。通过 hash 分配新连接。。
    tkmiles
        38
    tkmiles  
       2018-05-29 17:07:02 +08:00
    @est 好吧~~之前把 wait_queue 中的 exclusive 标志位和惊群给搞混了
    lolizeppelin
        39
    lolizeppelin  
       018-05-30 12:05:15 +08:00 via Android
    惊群对 Python 这种慢玩意还不是什么问题
    实在有影响可以抄 Nginx 的做法
    est
        40
    est  
    OP
       2018-05-30 12:13:28 +08:00
    @lolizeppelin 人艰不拆。
    bnm965321
        41
    bnm965321  
       2018-05-30 12:58:27 +08:00
    GIL 其实不是什么重要的事情
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2809 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 14:43 PVG 22:43 LAX 06:43 JFK 09:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86