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

2019-11-09 16:36:30 +08:00
 pompeii

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

5424 次点击
所在节点    程序员
30 条回复
ClericPy
2019-11-09 23:52:45 +08:00
比较赞同 16# 的看法, 感觉确实不是为了讨论问题, 就是在为了说服对方...

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

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

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

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

几个 while(true) 要把操作系统给卡死?
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
2019-11-10 13:28:41 +08:00
python 的线程是真线程
因为 gil 不能多核而已
python 多场线程与其他语言的多线程基本一样
是否加锁 具体粒度要看对应虚拟机源码
hhyvs111
2019-11-10 14:22:49 +08:00
没涉及到资源争用就不用加锁啊
pompeii
2019-11-11 09:22:40 +08:00
@xduanx #16 确实,我一开始发现他对自己的想法很坚持的时候,特别想说服他,一度陷入你说的那种状态,后来反应过来就不想和他争了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/617936

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX