首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

一个同事和我说线程间不会切换

  •  
  •   pompeii · 27 天前 · 4118 次点击

    争论了很久,现在心情不太好。我开始怀疑自己了。

    30 回复  |  直到 2019-11-11 09:22:40 +08:00
        1
    lcdtyph   27 天前 via iPhone
    有上下文吗?线程不切换的话多线程的意义在哪里
        2
    wakan190   27 天前 via Android
    光争论有啥用,做实验啊
        3
    pompeii   27 天前
    @lcdtyph #1 公司用 Python,标题中的同事为 B,我和一个同事 A 在讨论一个用了多线程的功能,我说现在用了多线程,几个涉及到 IO 的地方都被优化了,A 说能不能做到并行的效果(类似的意思),我说有锁要想其他的办法,然后我们继续 balabala,之后休息的时候 B 和我说,现在没有到那么高的层级,不用考虑 GIL,balabala 一大堆,说多线程怎么怎么样,然后就说出了线程间不会切换,我们争论了一会,我放弃了
        4
    pompeii   27 天前
    @wakan190 #2 说不服他的,我放弃了,不想折腾了
        5
    iyaozhen   27 天前 via Android
    @pompeii 还是感觉你问题没说清楚呀

    多线程切换也是 CPU 的事,你业务上确实不用关心切不切换。
        6
    labnotok   27 天前 via Android
    Python 的多线程对高 IO 并发还是有一些作用的,
    但是用 CPython 就别想着并行了。

    老老实实上多进程+协程不行吗
        7
    pompeii   27 天前
    @iyaozhen #5 确实没说太清楚。现在想想,他的核心问题就是,觉得在 CPython 中,多线程是并行的。
        8
    pompeii   27 天前
    @labnotok #6 明白这些,主要分歧就出在,他觉得 CPython 中多线程是并行的,我觉得不是。线程切换只是讨论时候提到了一句。
        9
    iyaozhen   27 天前 via Android
    @pompeii 宏观上看着确实是“并行”的。微观上 GIL 也没想象中的那么可怕。实在不行多起几个进程实例嘛,到了堆机器都不能解决的时候才真是大问题、大场景了
        10
    tabris17   27 天前
    如果是计算密集型应用,因为 GIL 的关系,无法并行计算,但是 IO 还是可以并行的
        11
    dbw9580   27 天前 via Android
    并行( parallel )和并发( concurrent )的争议?
        12
    reallynyn   27 天前 via iPhone
    在类 uinx 系统中,线程就是进程,只不过同进程的线程地址空间共享。所以可能出现一个进程内的多个线程同时在不同核心内执行的情况。锁就是为了解决同时读写问题发明的。
        13
    pompeii   27 天前
    @reallynyn #12 受教了
        14
    pompeii   27 天前
    @dbw9580 #11 恩,准确来说是‘CPython 多线程是并行还是并发’的争议
        15
    pompeii   27 天前
    @iyaozhen #9 恩,现在想想,可能和同事在考虑的范围上不一样
        16
    xduanx   27 天前   ♥ 1
    老罗和王自如争论的时候也是这样,
    我不是说你和和同事就像他们俩,
    我是说有时候争论不是为了真理,而是为了表面的胜负。
        17
    wazon   27 天前
    计算密集型想 python 搞并行,一般写成多进程而非多线程
        18
    akira   27 天前
    这种最好判断的了啊,写段代码跑一跑 谁对谁错 一目了然
        19
    Leigg   27 天前 via Android
    多进程是并行。
        20
    nullllllllllllll   27 天前
    理性讨论到最后都是诉诸立场和动机,太认真你就输了
        21
    ClericPy   27 天前   ♥ 3
    比较赞同 16# 的看法, 感觉确实不是为了讨论问题, 就是在为了说服对方...

    你俩好歹有一个明白人, 这争论就进行不下去, 具体讨论的是什么我也没看懂

    不过我猜你放弃的原因大概是: 对方一个劲地用自己的知识面把你往他已知的领域里带, 而不是真的想讨论出问题的答案, 就像平时经常见到的回帖答非所问一样(讨论的明明是 python 里多线程会不会切换, 回的却是劝人用协程...), 遇到这种情况真的只能友好地表示赞同一下了

    google 上随便搜个关键词 python multi-thread switch, 会看到很多相关的帖子讲这个, 第一个就提到切换频率问题了 "How often does Python switch threads? - Stack Overflow".

    简单的说协程就是用户态主动切换, 多线程靠一个类似于 checkinterval 的方式来不断切换(一般是遇到 IO 之类的阻塞). 所以我的理解就是, 就算是只能利用单个 CPU, 但是多个线程是会切换的, 切换的时候有个地方暂存运行状态相关的 context 和 栈信息.
        22
    also24   27 天前
    @ClericPy #21
    感谢,之前一直没能很好的总结出此类行为的特征:
    『一个劲地用自己的知识面把你往他已知的领域里带, 而不是真的想讨论出问题的答案, 就像平时经常见到的回帖答非所问一样』
        23
    mskf   27 天前
    他不知道有 scheduling 这个东西吗
        24
    no1xsyzy   27 天前
    @ClericPy 就是抢占式调度和非抢占式调度?
    不过虽然有 GIL 在,Python 代码只能一个线程跑,但换人时可能不会发生上下文切换?
    因为切换的是锁的状态而不是核心所跑的线程。
        25
    waytoexplorewhat   27 天前 via iPad
    是怎么不会切?看了相关知识之后,还是没能了解并运用,还是说之前并没有接触过,所以不会切。
        26
    Raymon111111   27 天前
    不会切换的后果是

    几个 while(true) 要把操作系统给卡死?
        27
    ClericPy   27 天前
    @no1xsyzy #24 底层是啥我给忘了, 看 google 到的那个 stackoverflow 讲的似乎是执行一段时间(interval) 后让出 CPU, 但是该线程的状态信息还是保留的, 这时候该 CPU 去计算另一个线程的任务, 有点类似于轮询. 而 gevent 实现的协程会把各种内置的或者可预见的底层 IO 相关的操作通通打上猴子补丁来主动让出 CPU, 感觉很像 goroutine... 至于抢占不抢占的, 在 python 这边更常见的两个词是 explicit 和 implicit 来形容原生多线程和基于事件循环的协程.
    PS: 前段时间发现 uvloop 性能不弱于 golang, 所以感觉 py 性能劣势很大程度就是动态语言本身的瓶颈无法逾越了...

    @also24 #22 这个槽点随着年龄增长会越来越常见, 应试教育和面试宝典的产物吧...
        28
    lolizeppelin   26 天前 via Android
    python 的线程是真线程
    因为 gil 不能多核而已
    python 多场线程与其他语言的多线程基本一样
    是否加锁 具体粒度要看对应虚拟机源码
        29
    hhyvs111   26 天前 via iPhone
    没涉及到资源争用就不用加锁啊
        30
    pompeii   26 天前
    @xduanx #16 确实,我一开始发现他对自己的想法很坚持的时候,特别想说服他,一度陷入你说的那种状态,后来反应过来就不想和他争了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2166 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 31ms · UTC 02:00 · PVG 10:00 · LAX 18:00 · JFK 21:00
    ♥ Do have faith in what you're doing.