Python多线程到底有没有用

首先要说明Python的多线程是伪并行的

什么是伪并行:

当我们在python中使用多线程的时候会分为主线程和若干个子线程,我们假设运行的程序一共有三个线程,分别为Thread1(主线程),Thread2(子线程),Thread3(子线程)。且CPU中只运行这个程序。
在这里插入图片描述

图中的黑色箭头是CPU的利用时间,也就是说在同一时间,CPU只能运行其中一个线程的代码,同时通过全局解释器锁GIL的请求和释放来切换线程,正常情况下每隔5毫秒就切换一次线程,从而达到伪并发的目的.

什么是全局解释器锁GIL:

它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。

为什么要有全局解释器锁GIL:

为了解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁,防止两个线程同时访问一个变量而造成未知的错误.就比如python中的列表是安全的数据类型就是通过加锁实现的(即默认python内部对象是thread-safe的,无需在实现时考虑额外的内存锁和同步操作).

题外话:即使是有全局解释器锁的存在,也避免不了多线程的资源竞争,造成这一原因的正是全局解释器锁

在什么地方使用多线程:

I/O密集型的python程序比计算密集型的程序更能充分利用多线程的好处,所有尽量不要再计算密集型的程序中使用多线程。如果无法避免的要使用也没有办法.举个例子,如果你想用PyQt5编写一个图形化软件,为了防止主线程假死从而导致的异常退出,就只能用多线程或者多进程去处理耗时的数据,而多进程通信又太麻烦,只能用多线程,以防止主线程阻塞。

什么是计算密集型和IO密集型:

CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。简单说就是CPU的执行时间占程序运行的大部分时间,小部分时间进行磁盘读写.

IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。I/O bound的程序一般在达到性能极限时,CPU占用率仍然较低。简单说就是CPU的执行时间占程序运行的小部分时间,大部分时间都在进行磁盘读写.

如何提高程序的运行速度(高效利用CPU):

1.使用协程

2.使用多进程

注意使用多进程对系统的开销过大,因为进程之间的通信要进行序列化和反序列化的操作.

总结:

每次在群里看到群友讨论python的多线程,总是有人说python的多线程没有用,不如其他语言执行的快。我想说的是每种语言都有它的优点和缺点,锤子不能拧螺丝,螺丝刀也不能定钉子。两种不同的东西比较是没有意义的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值