Ywc's blog

Pythonlearn

Word count: 1k / Reading time: 3 min
2018/05/09 Share

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学习笔记

原文作者: Ywc

原文链接: https://yinwc.github.io/2018/05/09/pythonlearn/

发表日期: May 9th 2018, 5:49:07 pm

版权声明:

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框架