Python 的多线程原来不是真的多线程啊

2019-11-20 10:33:19 +08:00
 vcfghtyjc

用了好几年 Python 今天第一次知道 Python 的多线程其实是顺序执行各个线程。真正并发还是要靠多进程,或者通过 Cython 调用 C/C++ 的库。

总的来说就是每个线程都需要获取 GIL 后才能执行。具体可以看链接

除了这个以外,各位还有什么在 Python 里踩过的坑吗?可以交流一下。

13110 次点击
所在节点    Python
55 条回复
hdbzsgm
2019-11-20 10:37:17 +08:00
你可以用没有 GIL 的解释器
scukmh
2019-11-20 10:38:35 +08:00
不是顺序执行多个线程,只是其他语言在系统线程上运行只需要有 cpu 执行权就可以了。python 还多要一个 gil.
binux
2019-11-20 10:39:04 +08:00
GIL 和是不是真线程无关。
xpresslink
2019-11-20 10:39:32 +08:00
从概念上说是真的线程。只是在 IO 密集场景下才有实质用处,IO 操作时线程会主动释放 GIL。但是在 CPU 密集场景 GIL 起主导作用。记住这一句基本上就够了。
676529483
2019-11-20 10:42:08 +08:00
本质不是多线程的错,python 的多线程和 c++的实现方式都是调用操作系统的接口,只是 GIL 对此做了限制。另外也不是完全没用,GIL 在碰到 IO 阻塞的时候,会释放 GIL,因此 IO 操作会比串行快一些
BBCCBB
2019-11-20 10:45:55 +08:00
一个进程的话只能交替执行呀
ipwx
2019-11-20 10:50:19 +08:00
是真线程,只不过有 gil 的情况下,除了调用 c 库(这比你想象的多)和 io 操作,只有一个线程能运行。
tt67wq
2019-11-20 10:51:36 +08:00
你说的是并发还是并行?
est
2019-11-20 10:52:38 +08:00
python 的 多线程就是真正的 os thread。其他语言才是假的 user thread/fiber
laike9m
2019-11-20 10:58:34 +08:00
Python 的多线程当然能实现(任务级别)的并发,你想说的是并行
vcfghtyjc
2019-11-20 11:02:12 +08:00
@tt67wq 不太清楚 Parallel 和 Concurrent 哪一个是并发,哪一个是并行。我想说的是:不能做到 Parallel
vcfghtyjc
2019-11-20 11:03:30 +08:00
@binux 怎么讲?
est
2019-11-20 11:05:26 +08:00
@vcfghtyjc python 怎么就不能做到 parallel 了。GIL 只能导致你没法有效利用多核 CPU 而已。然而市面上一大堆 C++ 游戏也只能跑满一个核啊。你们把 pthread 也拿出来批判一番?
wangxin13g
2019-11-20 11:05:46 +08:00
@est 借楼问一下 java 的线程是 os thread 么,没写过 java 但是按照之前的了解 好像 Java 用的系统层面的 epoll 来实现多线程?
ipwx
2019-11-20 11:05:46 +08:00
@vcfghtyjc @tt67wq 为啥老在多线程帖子下看见这俩概念。。。别本本主义好不好。python 并发没问题,asyncio 和 multiprocessing 都可以实现并发。多线程只是并发的一种实现方法。同时,多线程也不一定就是为了并发,也许是为了加速计算。甚至也许只是为了写程序容易点,用 queue 做个特殊的编程模型简化实现。
hhhsuan
2019-11-20 11:08:02 +08:00
是真的,如假包换的多线程。
vcfghtyjc
2019-11-20 11:11:12 +08:00
@est 没说 python 不能 parallel,而是 python 标准库里的多线程不能做到 parallel。抱歉没表达清楚。
jimages
2019-11-20 11:13:19 +08:00
3.9 出来,子解释器出来,就可以愉快的使用多线程了。
vcfghtyjc
2019-11-20 11:19:20 +08:00
@ipwx Multiprocessing 是可以实现 Parallel, 但是进程之间不能共享内存,这不会让消息传递的 overhead 过大吗?
guokeke
2019-11-20 11:29:55 +08:00
真正并发需要靠多核,单核多进程还不是轮流执行进程。

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

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

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

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

© 2021 V2EX