听说 Python 的多线程是假的,无法利用多核心?
查了一下 python 有一个叫 GIL 的全局锁,本质上无法做到多 CPU 核心的同时利用了?
那我现在有几个重 CPU 的任务,只能用多进程来实现了?还得搞多进程通信。。
查了一下 python 有一个叫 GIL 的全局锁,本质上无法做到多 CPU 核心的同时利用了?
那我现在有几个重 CPU 的任务,只能用多进程来实现了?还得搞多进程通信。。
或者 cpu 密集操作,多进程做也没问题。
node 主线程确实是单线程, 不过 Node 本身自己都承认擅长 IO 不擅长 CPU 计算.
不知道吐槽点在哪里.
import multiprocessing
如果你线程间传递数据要考虑加锁,
而进程间传递数据涉及到进程间通信(但是 Python 的库已经封装好了,很容易调用传递数据)
也就是说,你要“并行执行”,其实在 Python 中写线程和进程几乎没有差别。
如果你涉及到并行执行的“东西”要传递数据,只是把线程加锁的思考换成进程间通信的思考,也差不多。
然后如果是那种用 queue 发消息的传递数据类型,在 Python 中进程和线程的写法也是非常像…
所以问题不在于 GIL,
问题在于:
1. programmer 是否理解并发和并行
2. 是否理解 IO 密集和 CPU 密集
3. 是否知道 Python 有 GIL 这个东西
4. programmer 掌握的并发编程「模型」的水平。
而其它语言(比如 golang )好写并发代码(多线程),应该是人家已经给你限定好了一种并发模型,让“入门者”的就照着这么写就好了(恩,我没用过 golang,但是我猜是 golang 这样子的,有不对欢迎指正)。
“3. 是否理解‘线程内存(变量)共享’ 和 ‘进程内存拷贝’ 之间的区别”。
你的这种比较在选择了脚本语言 /动态语言的程序员眼里没有意义。
至少在我这边没有意义。
如果说别的语言并行比较好写,我会觉得是优点。
但是如果说别的语言多线程利用 CPU 比 Python 多进程利用 CPU “效率”更高,在我这边没有意义。
因为就是有像我这类开发者并不关心一门语言在机器上的执行速度,而是编程语言的其它方面。
(当然,根据应用的业务场景,语言在机器上的执行速度可能是重要的,
但这是针对业务的技术选型问题,不是编程语言本身的问题;
就像用锤子去敲螺丝,这不是锤子的问题,这是你选择锤子还是选择螺丝刀的问题。)
另外 JS 是单线程 ≠ JS 只能利用一丢丢计算资源,这里的单线程确切来说是用户能直接操作的是单线程。无论在浏览器还是在 Node 平台上,背后都有一堆工作线程在做事。能最大限度利用资源才是直接和最终的目标。
https://mp.weixin.qq.com/s/lIkcTuCX5htQcteklCFaZw