面向对象(OOP)基本概念
面向对象编程 —— Object Oriented Programming 简写 OOP
01. 面向对象基本概念
- 我们之前学习的编程方式就是 面向过程 的
- 面相过程 和 面相对象,是两种不同的 编程方式
- 对比 面向过程 的特点,可以更好地了解什么是 面向对象
1.1 过程和函数(科普)
- 过程 是早期的一个编程概念
- 过程 类似于函数,只能执行,但是没有返回值
- 函数 不仅能执行,还可以返回结果
记录工作中的点点滴滴
描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因。
Guido的声明:http://www.artima.com/forums/flat.jsp?forum=106&thread=214235
he language doesn’t require the GIL – it’s only the CPython virtual machine that has historically been unable to shed it.
单独执行该文件会占满一个CPU核心数(相当于单进程单线程),两个窗口执行该文件会占满两个CPU核心数(相当于两进程两线程)
1 | #!/usr/bin/env python |
单独执行该文件每个CPU核心会占一半(单进程两线程)
1 | #!/usr/bin/env python |
单独执行该文件会占满二个CPU核心数
1 | #!/usr/bin/env python |
总结:多线程并不是真正的并行,而是伪并行,也就是并发。原因就是因为线程有GIL全局解释器锁。只有进程才是真正的并行
- Python语言和GIL没有半毛钱关系。仅仅是由于历史原因在Cpython虚拟机(C语言解释器)中难以移除GIL。(其他python解释器没有GIL,比如java语言写的jpython解释器)
- GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
- 线程释放GIL锁的情况: 在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或Python 2.x,tickets计数达到100
计算密集型:程序没有延时,一直在计算数据;IO密集型:输入输出,读写操作
线程和协程适用于IO密集型,计算密集型考虑使用进程。- Python使用多进程是可以利用多核的CPU资源的。
- 多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁
子线程使用的是c语言的函数,此时单独执行该文件,会占满两个CPU核心
1 | from ctypes import * |