python多线程的实现
入门案例
1 import threading,time 2 ''' 3 #线程的创建有两种方式,1.直接调用,2.继承 4 ''' 5 # def run(n): 6 # print('test',n) 7 # #1.直接调用 8 # t1 = threading.Thread(target=run,args=(1,)) 9 # t2 = threading.Thread(target=run,args=(2,)) 10 # t1.start() 11 # t2.start() 12 # #2.继承 13 # class Mythread(threading.Thread): 14 # def __init__(self,n): 15 # super(Mythread,self).__init__() 16 # self.n = n 17 # def run(self): 18 # print('test',self.n) 19 # t1 = Mythread(1) 20 # t2 = Mythread(2) 21 # t1.start() 22 # t2.start() 23 #统计多个线程耗时,考虑到线程的并发执行,所以每个线程各自指向各自的,主线程执行完后会自动结束,并发执行的时间统计思路就是在线程执行后使用jion()方法,类似于java的wait() 24 def run(n): 25 print('thread-',n)
#为了更加直观的看到多线程执行的效果,我们使用sleep方法 26 time.sleep(2) 27 start_time = time.time() 28 t_list = [] 29 for i in range(50): 30 t = threading.Thread(target=run,args=('{}'.format(str(i)),)) 31 t.start() 32 t_list.append(t) 33 for j in t_list: 34 j.join() 35 end_time = time.time() 36 print('cost time = ',end_time - start_time)
#浅析pythongil机理
python gil lock中文名称叫做全局解释器锁,是python用来实现多线程的机制,c python的多线程在实际运行时实际上是单通道的,
即总是只能使用一核,利用cpu高速的上下文切换实现所谓的多线程的。潜在的危机,共享资源可能与我们预想的不一样。为此我
们来看以下代码在ubuntu上的运行效果:
1 #线程锁的研究 2 def run(n): 3 global num 4 #lock.acquire() #为加上本句时的运行效果如下图所示,去掉此处#后一切正常 5 num += 1 6 print('thread {}'.format(n)) 7 # time.sleep(0.8) 8 #lock.release() #去掉此处#后一切正常
9 num = 0
10 lock = threading.Lock()
12 for j in range(100):
13 t = threading.Thread(target=run,args=(j,))
14 t_list.append(t)
15 t.start()
for k in t_list: #每个线程开始的前提是等待上一个线程返回结果到共享池
k.join()
16 print(num)