V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
pompeii
V2EX  ›  程序员

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

  •  
  •   pompeii · 2019-11-09 16:36:30 +08:00 · 5429 次点击
    这是一个创建于 1876 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    多线程切换也是 CPU 的事,你业务上确实不用关心切不切换。
    labnotok
        6
    labnotok  
       2019-11-09 17:09:28 +08:00 via Android
    Python 的多线程对高 IO 并发还是有一些作用的,
    但是用 CPython 就别想着并行了。

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

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

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

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

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

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

    @also24 #22 这个槽点随着年龄增长会越来越常见, 应试教育和面试宝典的产物吧...
    lolizeppelin
        28
    lolizeppelin  
       2019-11-10 13:28:41 +08:00 via Android
    python 的线程是真线程
    因为 gil 不能多核而已
    python 多场线程与其他语言的多线程基本一样
    是否加锁 具体粒度要看对应虚拟机源码
    hhyvs111
        29
    hhyvs111  
       2019-11-10 14:22:49 +08:00 via iPhone
    没涉及到资源争用就不用加锁啊
    pompeii
        30
    pompeii  
    OP
       2019-11-11 09:22:40 +08:00
    @xduanx #16 确实,我一开始发现他对自己的想法很坚持的时候,特别想说服他,一度陷入你说的那种状态,后来反应过来就不想和他争了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:52 · PVG 21:52 · LAX 05:52 · JFK 08:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.