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

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

  •  
  •   pompeii · 73 天前 · 4236 次点击
    这是一个创建于 73 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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