既然Python解释器是单线程的,还有进行多线程编程的必要吗?

Python与机器学习 徐 自远 636℃
写再多的线程都绕不过解释器是单线程,那不还等于是单线程。且线程切换消耗,既然这样,python还有必要进行多线程编程吗?

谢邀,我们来聊聊Python的GIL问题。

CPython(标准的python实现)有一个名为GIL(全局解释器锁)的东西,它阻止两个线程在同一个程序中同时执行。 有些人对此感到不安,而其他人则狠狠地为此辩护。 但是,有一些解决方法,像Numpy这样的库通过在C中运行外部代码来绕过这个限制。

何时使用线程与进程?

  • 进程加速了CPU密集型的Python操作,因为它们受益于多个内核并避免使用GIL。
  • 线程最适合IO任务或涉及外部系统的任务,因为线程可以更有效地组合他们的工作。 进程需要挑选他们的结果来组合它们需要时间。

由于GIL,线程在python中没有为CPU密集型任务提供任何好处。而对于像Dot Product这样的某些操作,Numpy可以解决Python的GIL并且并行执行代码。

I/O的多线程使用

应用程序的大部分时间都花在I/O上。无论是磁盘I/O还是网络I/O。

例如,对于Web应用程序,大多数情况下是处理数据库。因此,在大多数现代应用程序中,最大的瓶颈是I/O。以下是开启4个线程后效果,实际上效果还是很显著的。

这意味着应用程序大部分都在等待,因此即使python没有GIL,也不是所有应用程序都会一直运行(使用cpu,因为它们将等待I/O完成)。

所以,在大多数应用程序线程在I / O上等待的情况下,其他线程可以获取CPU,从而提高性能。如果python没有多线程,那么其他一些线程无法获得cpu因此浪费时间。现在至少当一个线程正在等待I/O时(大部分应用程序都是这种情况),其余的线程都可以工作,那么多线程还是有它存在的必要,所以这就是我们没有看到GIL所拥有问题的原因。

当然如果你的应用程序是CPU密集型的,那么在python中确实没有太多的线程可以提供使用。


我会在这里发布所有与科技、科学有关的有趣文章,欢迎订阅我的头条号。偶尔也回答有趣的问题,有问题可随时在评论区回复和讨论。

先简单的回答:有必要。

首先,线程消耗的是CPU资源

如果一个单线程内处理的业务逻辑会占用100%的CPU资源,那么,上了多线程也是没有用的。

但这种情况很少,高CPU占用一般出现在内存计算场景下,或者不良代码中错误的死循环。 正常情况下,CPU占用大于80%就需要进行代码或设计的优化,或者服务器增加资源了。

多线程场景适用于解决慢速IO的问题

我们绝大部分的计算,都会依赖于很多外部资源IO,如磁盘读写、网络访问、数据库访问… 这些资源的访问速度远远低于CPU的切换速度。如果使用单线程进行操作时,就会长时间的等待IO的返回。造成无效等待,性能低下。

所以即使是Python,为了充分利用CPU资源,提高性能,在通常的业务场景下使用多线程编程也是完全必要的。

多核与Python多实例

延续上面的问题,我们知道现在CPU大部分都是多核的,python为了避免单线程只能使用到一个核的问题,是有个multiprocessing 库的,允许创建子进程(子进程数一般与核心数相同),来充分利用CPU资源。

↓ ↓ ↓ 喜欢就点赞吧,欢迎各位评论指教,谢谢关注 — 极迭代!python有个全局锁,你不知道什么是全局锁你可以百度查一下,由于这个全局锁的存在python的多线程其实就是个鸡肋,所以,一般都用异步协程的方式来搞定高并发!

既然Python解释器是单线程的,还有进行多线程编程的必要吗?(5个回答) – 悟空问答http://t.jinritoutiao.js.cn/eD2P7N/

转载请注明:徐自远的乱七八糟小站 » 既然Python解释器是单线程的,还有进行多线程编程的必要吗?

喜欢 (0)

苏ICP备18041234号-1 bei_an 苏公网安备 32021402001397号