关于GIL的案例

例1:

import threading
import time

def run(n):
    print("task",n)
    time.sleep(2)
    print("task done=>",n)

start_time=time.time()

for i in range(5):
    t=threading.Thread(target=run,args=('t-%s'%i,))
    t.start()

print('cost:',time.time()-start_time)

'''
执行结果:
task t-0
task t-1
task t-2
task t-3
task t-4
cost: 0.0009999275207519531
task done=> t-3
task done=> t-1
task done=> t-2
task done=> t-0
task done=> t-4
'''

例2:

import threading
import time

num=0

def run(n):
    print("task",n)
    global num
    num+=1
    time.sleep(2)
    print("task done=>",n,'num=',num)

start_time=time.time()

for i in range(5):
    t=threading.Thread(target=run,args=('t-%s'%i,))
    t.start()

print('cost:',time.time()-start_time)

'''
执行结果:
task t-0
task t-1
task t-2
task t-3
task t-4
cost: 0.0019998550415039062
task done=> t-0 num= 5
task done=> t-1 num= 5
task done=> t-3 num= 5
task done=> t-2 num= 5
task done=> t-4 num= 5
'''

分析上面两个例子的区别:

由例1输出可以分析得到:

        先生成的线程不一定先执行结束

例2引入了全局变量num,并且每次执行后会将num值输出。但是为什么每次的输出结果都是num=5呢,而不是依次递增?


实验3:

import threading
import time

num=0

def run(n):
    print("task",n)
    global num
    num+=1
    time.sleep(2)
    print("task done=>",n,'num=',num)

start_time=time.time()

for i in range(5):
    t=threading.Thread(target=run,args=('t-%s'%i,))
    if i==3:
        time.sleep(3)
    t.start()

print('cost:',time.time()-start_time)

'''
执行结果:
task t-0
task t-1
task t-2
task done=> t-2 num= 3
task done=> t-0 num= 3
task done=> t-1 num= 3
task t-3
task t-4
cost: 3.003000020980835
task done=> t-3 num= 5
task done=> t-4 num= 5
'''

例3当i==3时,手动暂停3秒,可以看到输出的结果符合预期,前三秒一样,后两秒一样。

但是为什么是这样,Python3中做了哪些关于锁的设置,没有深究。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值