python3多线程和GIL全局解释器所

#线程的并发是利用cpu上下文的切换(是并发,不是并行)#多线程执行的顺序是无序的#多线程共享全局变量#线程是继承在进程里的,没有进程就没有线程#GIL全局解释器锁#只要在进行耗时的IO操作的时候,能释放GIL,所以只要在IO密集型的代码里,用多线程就很合适
# 无序的,并发的def test1(n):
    time.sleep(1)
    print(‘task‘, n)

for i in range(10):
    t = threading.Thread(target=test1,args=(‘t-%s‘ % i,))
    t.start()
#计算并发所用的时间
import threading
import time

def test1(n):
    time.sleep(1)
    print(‘task‘, n)

def test2(n):
    time.sleep(1)
    print(‘task‘, n)

start = time.time()
l = []
t1 = threading.Thread(target=test1, args=(1,))
t2 = threading.Thread(target=test1, args=(2,))
t1.start()
t2.start()
l.append(t1)
l.append(t2)
for i in l:
    i.join()
end = time.time()
print(end - start)

GIL的全称是:Global Interpreter Lock,意思就是全局解释器锁,这个GIL并不是python的特性,他是只在Cpython解释器里引入的一个概念,而在其他的语言编写的解释器里就没有这个GIL例如:Jython,Pypy

为什么会有gil?:

随着电脑多核cpu的出现核cpu频率的提升,为了充分利用多核处理器,进行多线程的编程方式更为普及,随之而来的困难是线程之间数据的一致性和状态同步,而python也利用了多核,所以也逃不开这个困难,为了解决这个数据不能同步的问题,设计了gil全局解释器锁。

说到gil解释器锁,我们容易想到在多线程中共享全局变量的时候会有线程对全局变量进行的资源竞争,会对全局变量的修改产生不是我们想要的结果,而那个时候我们用到的是python中线程模块里面的互斥锁,哪样的话每次对全局变量进行操作的时候,只有一个线程能够拿到这个全局变量;看下面的代码:

import threading
global_num = 0

def test1():
    global global_num
    for i in range(1000000):
        global_num += 1

    print("test1", global_num)

def test2():
    global global_num
    for i in range(1000000):
        global_num += 1

    print("test2", global_num)

t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
t2.start()

在上面的例子里,我们创建了两个线程来争夺对global_num的加一操作,但是结果并非我们想要的,所以我们在这里加入了互斥锁

import threading
import time
global_num = 0

lock = threading.Lock()

def test1():
    global global_num
    lock.acquire()
    for i in range(1000000):
        global_num += 1
    lock.release()
    print("test1", global_num)

def test2():
    global global_num
    lock.acquire()
    for i in range(1000000):
        global_num += 1
    lock.release()
    print("test2", global_num)

t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
start_time = time.time()

t1.start()
t2.start()

原文地址:https://www.cnblogs.com/fengzi7314/p/10017364.html

时间: 2024-10-27 21:12:31

python3多线程和GIL全局解释器所的相关文章

python 并发编程 多线程 GIL全局解释器锁基本概念

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

GIL(全局解释器锁)

GIL(全局解释器锁) 我们知道多进程(mutilprocess) 和 多线程(threading)的目的是用来被多颗CPU进行访问, 提高程序的执行效率. 但是在python内部存在一种机制(GIL),在多线程 时同一时刻只允许一个线程来访问CPU. GIL 并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编译器例如GCC,INTEL C++,Visual C++等.

GIL全局解释器锁和进程池.线程池

GIL全局解释器锁 GIL本质就是一把互斥锁,是夹在解释器身上的,同一个进程内的所有线程都需要先抢到GIl锁,才能执行解释器代码 GIL的优缺点: 优点:保证Cpython解释器内存管理的线程安全 缺点:同一个进程内所有的线程同一时刻只能有一个执行,也就是说Cpython解释器的多线程无法实现并行,无法取得多核优势 GIL与单线程 每个进程的内存空间中都有一份python解释器的代码,所以在单线程的情况下,GIL锁没有线程争抢,只有垃圾回收机制线程会定时获取GIL权限 GIL与多线程 有了GIL

GIL全局解释器锁

1.什么是GIL全局解释器锁? GIL并不是Python的特性,而是CPython解释器的概念.Python完全可以不依赖于GIL. GIL本质是一把互斥锁,是加在CPython解释器身上的,同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码 2.为什么会有GIL? 为了利用多核,Python开始支持多线程,而解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁,于是有了GIL这把超级大锁. 简单的说GIL的存在更多的是历史原因. 3.GIL的影响 GIL的存在会对多线程的效率

python GIL :全局解释器

cpython 解释器中存在一个GIL(全局解释器锁),无论多少个线程.多少颗cpu 他的作用就是保证同一时刻只有一个线程可以执行代码,因此造成了我们使用多线程的时候无法实现并行. 因为有GIL的存在.所以同一时刻只能有一个线程被CPU执行 任务:IO 密集型:可以采用多线程(多进程+协成) 计算密集型:python不适用 (1)IO 密集型.CPU会是实现自动切换 提高工作效率 def ListenMusic(name): print("beging listening to %s,%s&qu

Python 36 GIL全局解释器锁

一:GIL全局解释器锁介绍 在CPython中,全局解释器锁(或GIL)是一个互斥锁, 它阻止多个本机线程同时执行Python字节码.译文:之所以需要这个锁, 主要是因为CPython的内存管理不是线程安全的.(然而,由于GIL的存在, 其他特性已经变得依赖于它所执行的保证.) 1. 什么是GIL全局解释器锁GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线程无法实现并行

10 并发编程-(线程)-GIL全局解释器锁&死锁与递归锁

一.GIL全局解释器锁 1.引子 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念. 就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.>有名的编译器例如GCC,INTEL C++,Visual C++等.Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行

进程、线程与GIL全局解释器锁详解

进程与线程的关系: 1. 线程是最小的调度单位 2. 进程是最小的管理单元 3. 一个进程必须至少一个线程 4. 没有线程,进程也就不复存在 线程特点: 3 线程的并发是利用cpu上下文的切换(是并发,不是并行) 4 多线程执行的顺序是无序的 5 多线程共享全局变量 6 线程是继承在进程里的,没有进程就没有线程 7 GIL全局解释器锁 8 只要在进行耗时的IO操作的时候,能释放GIL,所以只要在IO密集型的代码里,用多线程就 9 很合适 线程详解: import threading # --->

python第三十七天,GIL全局解释器锁*****,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe