Ywc's blog

Pythonlearn

Word count: 1.1kReading time: 3 min
2018/05/09

python知识树

pythonlearn

知识记录

PythonGIL、原子操作、线程安全

参考文章:https://www.cnblogs.com/ArsenalfanInECNU/p/9968621.html

GIL

GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。即便在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程。这样做是为了Python解释器中原子操作的线程安全
当执行多线程程序时,由GIL来控制同一时刻只有一个线程能够运行。

GIL的优点:GIL可以保证我们在多线程编程时,无需考虑多线程之间数据完整性和状态同步的问题。

GIL的缺点:我们的多线程程序执行起来是“并发”,而不是“并行”。因此执行效率会很低,会不如单线程的执行效率。

规避GIL带来的影响:

  • 用multiprocess(多进程)替代Thread(推荐)
  • 使用互斥锁:在开发中我们可以使用互斥锁来保护某个对象,使得在多线程同时访问某个对象的时候,不会将该对象破坏

总结:

  • 因为GIL的存在,只有IO Bound场景下得多线程会得到较好的性能
  • 如果对并行计算性能较高的程序可以考虑把核心部分也成C模块,或者索性用其他语言实现
  • 在Python编程中,如果想利用计算机的多核提高程序执行效率,用多进程代替多线程
  • 即使有GIL存在,由于GIL只保护Python解释器的状态,所以对于非原子操作,在Python进行多线程编程时也需要使用互斥锁(如thread中的lock)保证线程安全。
    GIL在较长一段时间内将会继续存在,但是会不断对其进行改进

原子操作

原子操作:原子操作就是不会因为进程并发或者线程并发而导致被中断的操作,特点是要么一次全部执行,要么全不执行。
当对全局资源存在写操作时,如果不能保证写入过程的原子性,会出现脏读脏写的情况。

线程安全

进程是系统资源分配的最小单位,线程是程序执行的最小单位

线程安全一般都涉及到synchronized,就是多线程环境中,共享数据同一时间只能有一个线程来操作,不然中间过程可能会产生不可预制的结果。

线程、进程、协程

参考文章:https://www.cnblogs.com/Survivalist/p/11527949.html

线程是执行程序的最小单位
进程是系统资源分配的最小单位
协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行.

  • 协程极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
  • 不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多

协程参考文章

一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
一个进程可以拥有多个线程,一个线程也可以拥有多个协程

Python爬虫

爬虫基本概念

爬虫实战

爬虫数据提取

Python Web框架

Django学习笔记

CATALOG
  1. 1. python知识树
  2. 2. 知识记录
    1. 2.1. PythonGIL、原子操作、线程安全
      1. 2.1.1. GIL
      2. 2.1.2. 原子操作
      3. 2.1.3. 线程安全
    2. 2.2. 线程、进程、协程
  3. 3. Python爬虫
  4. 4. Python Web框架