多线程及GIL全局锁

admin / 开发 / ... / Reads: 1074

  1. GIL是什么?

首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器(Cpython)时所引入的一个概念。

而Cpython是大部分环境下默认的python执行环境,要明确一点:GIL并不是python的特性,python完全可以不依赖于GIL。

  1. 为什么会有GIL?

为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据的一致性和状态同步的完整性

(例如:线程2需要线程1执行完成的结果,然而线程2又比线程1代码量少,线程2执行完成,线程1仍然还在执行,这就是数据的同步性)

python为了利用多核,开始支持多线程,而解决多线程之间数据完整性和状态同步最简单的方式就是加锁。

  1. GIL的影响

GIL无疑就是一把全局排它锁,全局锁的存在会对多线程的效率有不小的影响。甚至就几乎等于python是个单线程的程序。

下面通过实例来测试python单线程和多线程:

    
#!_*_coding:utf-8_*_
# Author: hkey
import threading, time
def run_thread():
    n = 0
    while n <= 100000000:
        n += 1

def single_run():
    start_time = time.time()
    for i in range(4):
        t = threading.Thread(target=run_thread,)
        t.start()
        t.join()    # 四个线程串行执行
    print('single thread times:', time.time()-start_time)
def multi_run():
    thread_list = []
    start_time = time.time()
    for i in range(4):
        t = threading.Thread(target=run_thread,)
        t.start()
        thread_list.append(t)
    for t in thread_list:
        t.join()    # 四个线程并行执行
    print('multi threads times:', time.time()-start_time)

if __name__ == '__main__':
    single_run()
    multi_run()
# 线程的串行和并行是通过join()方法来确定的,join方法是阻塞当前线程并等待正在执行的子线程执行完毕。

执行结果:

single thread times: 28.13599991798401
multi threads times: 29.76200008392334

通过结果可以发现,单线程串行执行效率和多线程并发相比要快,这也证明了GIL全局锁的存在

  1. python多线程并行执行原理

在双核cpu主机上,两个线程均为CPU密集型运算线程,这里假设每个线程单独占用一核cpu,因为GIL锁的缘故,

同一时间片就只能有一个线程获得GIL全局锁,而另一个占用cpu的线程则无法执行,继续等待,cpu时间就白白浪费掉,

也就是只有获得GIL锁的线程才能真正在cpu上运行。所以,多线程在python中只能交替执行,即使100个线程跑在100核cpu上,也只能用到1核。

  1. 如何避免受到GIL的影响

既然python的多线程在多核主机上这么鸡肋,那有什么更好的方式实现多并发吗? 用进程+协程 代替 多线程的方式

在多进程中,由于每个进程都是独立的存在,所以每个进程内的线程都拥有独立的GIL锁,互不影响。

但是,由于进程之间是独立的存在,所以进程间通信就需要通过队列的方式来实现。

关于作者

王硕,十年软件开发经验,业余产品经理,精通Java/Python/Go等,喜欢研究技术,著有《PyQt 5 快速开发与实战》《Python 3.* 全栈开发》,多个业余开源项目托管在GitHub上,欢迎微博交流:

Comments

Make a comment

Author: admin

Publish at: ...

关于作者

王硕,网名信平,十多年软件开发经验,架构师,熟悉 Java/Python/Go 等,喜欢研究技术,读书,音乐和宅在家里。
专注于研究互联网产品和技术,提供中文精品教程。 本网站与其它任何公司及/或商标无任何形式关联或合作。
Email: xujieiata@163.com

www.ultrapower.com ,王硕的博客,专注于研究互联网产品和技术,提供中文精品教程。 本网站与其它任何公司及/或商标无任何形式关联或合作。