#b计算机基础/c_计算机系统/整理
2019年12月22日 下午10:21
结论:
- 稳定性:进程 > 线程
- 创建的代价:进程 > 线程
- 执行速度:要根据操作系统判断
- 任务类型:计算密集型 vs. IO密集型
- Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。
模块实现说明:
- 整个模块输入是以python启动的一个网络服务,其中使用的接口是http,接受的对象是json字符串,来接受画图的原始数据;由于考虑到可能会出现并发访问,所以每次画图都会新建一个线程来画图
- 出现的问题: 有时会出现原本画一个图只需要6s,但是偶然会出现40s的情况
原因分析:
- 多线程在Python中只能在一个核上交替执行:当发生并发访问时,此时会启动多个线程,在一个核心上不断的调度,分配时间片,这就会导致时间长很多。
- 理论分析:
- 多线程 - 廖雪峰的官方网站
- 因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock, 任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。 这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。
- python多线程代码运行速度更慢-原因解析
- 在 单核CPU机器上,多线程与单线程在本质上并无不同 ,因为所有线程都是轮流占用CPU。多个线程慢于一个线程,因为其他线程还要先调度出来,再等待。
- 在 多核CPU机器上,多线程代码运行性能会非常糟糕 ,比单核更糟糕。因为这时候多一个步骤,不同的CPU再竞争GIL,GIL只有一个。Python在多核CPU上的多核CPU也只有单线程在跑程序。
解决方法:python就不要使用多线程!!!
- 不使用多线程:
- 绕过GIL,使用进程来代替线程:因为多个Python进程有各自独立的GIL锁,互不影响。
- 做一个队列,来获取得到的原始json数据,保存到队列中;再用一个线程/进程来循环访问队列(或者找到一种回调方式,当队列中有数据时按顺序回调画图函数)