听说 Python 的多线程是假的,无法利用多核心?

2020-10-27 15:03:43 +08:00
 James369
貌似 js 也是单线程,唉,脚本语言。。

查了一下 python 有一个叫 GIL 的全局锁,本质上无法做到多 CPU 核心的同时利用了?

那我现在有几个重 CPU 的任务,只能用多进程来实现了?还得搞多进程通信。。
5348 次点击
所在节点    Python
31 条回复
nightwitch
2020-10-27 19:27:59 +08:00
@xiaoshenke 看平台的,在 Linux 下线程和进程的开销基本是相同的,都是一个 task_struct 。
ivi
2020-10-28 14:43:56 +08:00
LZ,想问下多线程=并发执行这个有什么问题吗?
xiaoshenke
2020-10-28 14:48:45 +08:00
@nightwitch ??????怎么可能
maxxfire
2020-10-28 14:58:50 +08:00
@ivi python 中的多线程,实质上是单 CPU 执行,非并发操作。因为有个全局锁在同步。
fasionchan
2020-10-29 08:12:52 +08:00
关于 GIL 的由来、Python 虚拟机线程调度、IO 密集型以及计算密集型程序区别、以及如何绕过 GIL 取得多核心利用能力这些话题,可以参考这篇文章:

https://mp.weixin.qq.com/s/lIkcTuCX5htQcteklCFaZw
no1xsyzy
2020-10-29 14:49:09 +08:00
@xiaoshenke 你对线程和进程关系理解错误。
进程就是内核独立配给资源的线程,线程就是共享部分资源的进程,两者在 CPU 密集运算上没有区别。
之前还有 IPC 的问题,但现在还有 shared_memory,区别更加模糊
no1xsyzy
2020-10-29 14:53:15 +08:00
lz 你是没分清并发( concurrency )和并行( parallel )……
多线程 = 并发几乎是对的 —— 除非你强行用 PC 锁,这个操作既麻烦又难以理解,但我确实可以开五个线程,并且通过锁和队列来强制严格的执行顺序。
xiaoshenke
2020-10-29 19:35:13 +08:00
@no1xsyzy 合着起进程不需要有拷贝母进程分配进程资源的过程了。我看你是读书读傻了
no1xsyzy
2020-10-29 21:54:16 +08:00
@xiaoshenke copy on write 啊……
20 个进程除了污染 ps 列表和需要 IPC 以外没什么毛病
而且 20 个线程依然有上下文切换和缓存未命中的问题,GC 更是几百倍消耗。
你这么说不如直接 C / C++ / Rust,Java 算个雕?
fasionchan
2020-10-30 13:29:33 +08:00
@no1xsyzy 真要细说进程和线程的差别,页表应该算一个。同个进程内的线程切换,不需要切页表;但不同进程切换需要切页表,刷 TLB,性能点差别。不过话说回来,如果对这点性能都敏感,还用啥 Python ……
no1xsyzy
2020-11-02 01:39:24 +08:00
@fasionchan …… 话说一般是分在多核心上的吧,页表切换实际影响的是 L3 缓存?而且一不小心可能分到多个 CCX 上去……
要充分享受 CPU 缓存干脆连带厚重运行时的 Python Java C# 都 pass,缓存脱靶太常见了,一个 call 基本就要脱靶了。
所以并行计算就应该用函数式写(突然暴论

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

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

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

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

© 2021 V2EX