浅谈并行并发与GIL锁

并发和并行

什么是并发什么是并行,他们的区别是什么?

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行.

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后电话以后继续吃饭,这说明你支持并发。

你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发:交替处理多个任务的能力

并行:同时处理多个任务的能力

并发的关键是你有处理多个任务的能力,不一定要同时。

并行的关键是你有同时处理多个任务的能力,强调的是同时.

所以它们最大的区别就是:是否是『同时』处理任务。


GIL(全局解释器锁)

GIL是什么:一个防止多线程并发执行机器码的一个Mutex

  一个进程里只有一个GIL锁,线程只能拿到GIL锁才能运行,所以python多线程的假的         

           首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。Python的代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。

           GIL锁是历史遗留下来的问题,上世纪九十年代python创始人“龟叔”,为了解决线程安全问题写的一个锁。

           官方给出的解释大概就是: 在CPython,全局解释器锁,是一个互斥锁,它阻止多线程同时执行Python字节码。这个锁是必要的,主要是因为CPython的内存管理不是线程安全的。(然而,由于GIL的存在,其他特征已经发展成依赖于它所实施的保证。)  =========》 意思就是 :在Cpython解释器中这个GIL锁基本不能移除

        

问题:描述Python GIL的概念, 以及它对python多线程的影响?阐明多线程抓取程序是否可比单线程性能有提升,并解释原因。
参考答案:
  1. Python语言和GIL没有半毛钱关系。仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL。
  2. GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
  3. 线程释放GIL锁的情况: 在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或Python 2.x,tickets计数达到100
  4. Python使用多进程是可以利用多核的CPU资源的。
  5. 多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁

解决GIL锁方法:
1:更换解释器 比如使用jpython(java实现的python解释器)
2:使用多进程完成多任务的处理

结论:

       1. 在 处理像科学计算 这类需要持续使用cpu的任务的时候 单线程会比多线程快

      2. 在 处理像IO操作等可能引起阻塞的这类任务的时候 多线程会比单线程快

猜你喜欢

转载自blog.csdn.net/weixin_41790086/article/details/80196743