在群里经常听到这样的争执,有人是虚心请教问题,有人就大放厥词因为这个说python辣鸡。而争论的核心无非就是,python的多线程在同一时刻只会有一条线程跑在CPU里面,其他线程都在睡觉。这是真的吗?

是真的。这个就是因为传说中的GIL(全局解释锁)的存在。不明白这个词的可以去百度一下,我解释不好(大家都是程序猿你懂的,我写错一个词就要挨喷了,就算我没写错对方理解错了,我也一样要挨喷)。有了这样一个看似bug的存在,就导致了上面说的情况:同一时刻内,python的线程只有一条在CPU里面运行。

所以python的多线程就没用咯?当然不是。这要看程序是什么样的。如果是一个计算为主的程序(专业一点称为CPU密集型程序),这一点确实是比较吃亏的,每个线程运行一遍,就相当于单线程再跑,甚至比单线程还要慢——CPU切换线程的上下文也是要有开销的。但是,如果是一个磁盘或网络为主的程序(IO密集型)就不同了。一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,而单线程的话此时还是在一个一个等待的。我们都知道IO的速度比起CPU来是慢到令人发指的,python的多线程就在这时候发挥作用了。比方说多线程网络传输,多线程往不同的目录写文件,等等。

话说回来,CPU密集型的程序用python来做,本身就不合适。跟C,Go,Java的速度比,实在性能差到没法说。你当然可以写个C扩展来实现真正的多线程,用python来调用,那样速度是快。我们之所以用python来做,只是因为开发效率超高,可以快速实现。

最后补充几点:

python中要想利用好CPU,还是用多进程来做吧。或者,可以使用协程。multiprocessing和gevent在召唤你。

GIL不是bug,Guido也不是水平有限才留下这么个东西。龟叔曾经说过,尝试不用GIL而用其他的方式来做线程安全,结果python语言整体效率又下降了一倍,权衡利弊,GIL是最好的选择——不是去不掉,而是故意留着的。

想让python计算速度快起来,又不想写C?用pypy吧,这才是真正的大杀器。

python多线程没用_python的多线程到底有没有用?相关推荐

  1. python多线程没用_Python 的多线程原来不是真的多线程啊

    55 2019-11-23 00:43:59 +08:00 1 所以这些 CS 导论就该明确方向的系列问题怎么还那么经-- 还是得从基础概念入手. https://stackoverflow.com/ ...

  2. python多线程没用_Python中的多线程cv2.imshow()不起作用

    我有两个摄像头(使用OpenNI,每个摄像头有两个流,由相同的驱动程序API实例处理),并且想要两个线程,每个线程捕获数据从每个摄像机独立,即驱动程序API的一个实例,说cam_handler,我有两 ...

  3. python不断刷新网页_python使用多线程不断刷新网页的方法

    本文实例讲述了python使用多线程不断刷新网页的方法.分享给大家供大家参考.具体如下: 这段代码可以开通过个线程不断刷新指定的页面,可用于刷票,增加网页访问量等等,不用再去按F5了 import t ...

  4. python多线程扫描_python实现多线程扫描网站目录

    python实现网站目录扫描 st=>start: 程序开始 op=>operation: 打印banner信息 op2=>operation: 打印使用方法 op3=>ope ...

  5. python 多线程同步_Python利用多线程同步锁实现多窗口订票系统(推荐)

    利用Python实现多窗口订票系统,利用 threading.Lock() 避免出现一票多卖,无票也卖的情况,并规范化输出情况. 代码: import threading import time ti ...

  6. python 主线程_Python threading多线程模块

    Python是支持使用多线程的,程序代码可以在一个进程空间中操作管理多个执行的线程,python模块下载时要记得,这个库叫做 threading. 一.threading模块简介 在Python多线程 ...

  7. python多线程编程_python之多线程编程

    python 之多线程编程 我们知道 python 中程序一般是从上往下依次执行的,那么即使没有什么联系的两件事也只 能是等一个执行完后再去执行另一个, 这样的就会很浪费时间, 那么有没有办法让两件事 ...

  8. python爬虫代理服务器_Python爬虫多线程抓取代理服务器

    Python作为一门功能强大的脚本语言来说,经常被用来写爬虫程序,下面是Python爬虫多线程抓取代理服务器 首先通过谷歌把包含代理服务器地址的网页查出来,我选择从 http://www.88181. ...

  9. python paramiko并发_python paramiko 多线程批量执行指令及批量上传文件和目录

    源代码: 环境需求: 1.python3 2.paramiko pip install --upgrade pip apt-get install libssl-dev pip3 install pa ...

最新文章

  1. flutter报错Could not connect to lockdownd, error code -
  2. 说说软件开发这个职业
  3. Linux LXC基本配置选项
  4. How to Set up SSH Tunneling (Port Forwarding)?
  5. 革命性新特性 | 单一应用跨多Kubernetes集群的部署与管理
  6. $(document).scrollTop()与$(window).scrollTop()
  7. FreeRTOS源码分析与应用开发05:信号量
  8. Lisp入门(好文)
  9. 打表(1215)七夕节
  10. iOS开发--XMPPFramework--用户登录(三)
  11. matlab绘制奈奎图,matlab画奈奎斯特图
  12. 如何下载哔哩哔哩视频
  13. 【云原生之Docker实战】使用Docker部署Wizard文档管理系统
  14. 深度学习那么火,深度学习图形工作站应该更火。最新配置推荐。
  15. 小说网接口,根据书库号和小说名查询
  16. 【vbers】ibv_reg_mr|RDMA
  17. Torch中的benchmarkdeterministic是什么含义?
  18. Java 如何给现有PDF文档添加页码
  19. C# Excel 新建工作表,新增工作表,更改工作表的名字
  20. UE4学习笔记--EQS系统

热门文章

  1. 返回用户指定页面的web服务器
  2. 和李洪强一起学设计01 PS第一天
  3. 获取网页各种宽高的值
  4. Guava包学习--EventBus
  5. Java中的显示锁 ReentrantLock 和 ReentrantReadWriteLock
  6. (多图) 基于Verilog HDL的FIR数字滤波器设计与仿真
  7. MongoDB的NUMA CPU架构问题
  8. Unity iOS打开AppStore评星页面,浅谈Application.OpenURL()方法。
  9. ulipad 编辑器下载
  10. 在拓扑图上做标准ACL和扩展ACL(期末考试)