争论了很久,现在心情不太好。我开始怀疑自己了。
1
lcdtyph 2019-11-09 16:38:05 +08:00 via iPhone
有上下文吗?线程不切换的话多线程的意义在哪里
|
2
wakan190 2019-11-09 16:47:08 +08:00 via Android
光争论有啥用,做实验啊
|
3
pompeii OP @lcdtyph #1 公司用 Python,标题中的同事为 B,我和一个同事 A 在讨论一个用了多线程的功能,我说现在用了多线程,几个涉及到 IO 的地方都被优化了,A 说能不能做到并行的效果(类似的意思),我说有锁要想其他的办法,然后我们继续 balabala,之后休息的时候 B 和我说,现在没有到那么高的层级,不用考虑 GIL,balabala 一大堆,说多线程怎么怎么样,然后就说出了线程间不会切换,我们争论了一会,我放弃了
|
5
iyaozhen 2019-11-09 17:05:58 +08:00 via Android
|
6
labnotok 2019-11-09 17:09:28 +08:00 via Android
Python 的多线程对高 IO 并发还是有一些作用的,
但是用 CPython 就别想着并行了。 老老实实上多进程+协程不行吗 |
8
pompeii OP @labnotok #6 明白这些,主要分歧就出在,他觉得 CPython 中多线程是并行的,我觉得不是。线程切换只是讨论时候提到了一句。
|
9
iyaozhen 2019-11-09 17:17:15 +08:00 via Android
@pompeii 宏观上看着确实是“并行”的。微观上 GIL 也没想象中的那么可怕。实在不行多起几个进程实例嘛,到了堆机器都不能解决的时候才真是大问题、大场景了
|
10
tabris17 2019-11-09 17:24:40 +08:00
如果是计算密集型应用,因为 GIL 的关系,无法并行计算,但是 IO 还是可以并行的
|
11
dbw9580 2019-11-09 17:33:31 +08:00 via Android
并行( parallel )和并发( concurrent )的争议?
|
12
reallynyn 2019-11-09 17:57:55 +08:00 via iPhone
在类 uinx 系统中,线程就是进程,只不过同进程的线程地址空间共享。所以可能出现一个进程内的多个线程同时在不同核心内执行的情况。锁就是为了解决同时读写问题发明的。
|
16
xduanx 2019-11-09 19:22:15 +08:00 1
老罗和王自如争论的时候也是这样,
我不是说你和和同事就像他们俩, 我是说有时候争论不是为了真理,而是为了表面的胜负。 |
17
wazon 2019-11-09 19:23:19 +08:00
计算密集型想 python 搞并行,一般写成多进程而非多线程
|
18
akira 2019-11-09 22:09:02 +08:00
这种最好判断的了啊,写段代码跑一跑 谁对谁错 一目了然
|
19
Leigg 2019-11-09 23:23:38 +08:00 via Android
多进程是并行。
|
20
nullllllllllllll 2019-11-09 23:27:20 +08:00
理性讨论到最后都是诉诸立场和动机,太认真你就输了
|
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 和 栈信息. |
22
also24 2019-11-10 00:29:37 +08:00
|
23
mskf 2019-11-10 00:55:40 +08:00
他不知道有 scheduling 这个东西吗
|
24
no1xsyzy 2019-11-10 01:03:38 +08:00
|
25
waytoexplorewhat 2019-11-10 01:07:26 +08:00 via iPad
是怎么不会切?看了相关知识之后,还是没能了解并运用,还是说之前并没有接触过,所以不会切。
|
26
Raymon111111 2019-11-10 01:35:59 +08:00
不会切换的后果是
几个 while(true) 要把操作系统给卡死? |
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 这个槽点随着年龄增长会越来越常见, 应试教育和面试宝典的产物吧... |
28
lolizeppelin 2019-11-10 13:28:41 +08:00 via Android
python 的线程是真线程
因为 gil 不能多核而已 python 多场线程与其他语言的多线程基本一样 是否加锁 具体粒度要看对应虚拟机源码 |
29
hhyvs111 2019-11-10 14:22:49 +08:00 via iPhone
没涉及到资源争用就不用加锁啊
|
30
pompeii OP @xduanx #16 确实,我一开始发现他对自己的想法很坚持的时候,特别想说服他,一度陷入你说的那种状态,后来反应过来就不想和他争了
|