例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中做了哪些关于锁的设置,没有深究。