python-多线程趣味(锁)
接上一篇,程序员在敲代码的时候觉得无聊,无聊的时候,会想到去吃零食,那么假如一个函数:
#! /usr/bin/env python #coding=utf-8 ''' ''' import time import threading class MyThread(threading.Thread): def __init__(self,func,args,name=''): threading.Thread.__init__(self) self.name = name self.func = func self.args = args def run(self): #某某线程要开始了 print(self.name + "开始了#######") if self.name == "听歌线程": matter1(music) elif self.name == "打码线程": matter2(number) elif self.name == "零食线程": matter3(snacks) print(self.name + "结束了########") def matter1(music): for i in range(0,len(music)): print("第" + str(i+1) + "首歌是:" + str(music[i])) #假设每一首歌曲的时间是2s time.sleep(2) print("切换下一首歌...") def matter2(number): j = 1 while j <= number: print("我准备写入第" + str(j) + "行代码") j = j+1 #假设每一行代码的时间为1s time.sleep(1) print("写下一行代码...") def matter3(snacks): for i in range(0,len(snacks)): print("我正在听着歌吃" + str(snacks[i]) + "零食") #假设没吃一袋零食间隔为5s time.sleep(5) print("吃完一包零食") if __name__ == '__main__': #设定我要听的歌曲为 music = ['music1','music2','music3'] #设定我要打码的行数 number = 4 #设定我要吃的零食为 snacks = ["辣条","可乐"] #开始时间 start = time.time() thing1 = MyThread(matter1,music,"听歌线程") thing2 = MyThread(matter2,number,"打码线程") thing3 = MyThread(matter3,snacks,"零食线程") thing1.start() thing2.start() thing3.start() thing1.join() thing2.join() thing3.join() #结束时间 end = time.time() print("完成的时间为:",str(end - start))
结果:
完成的时间为: 10.001572132110596
但是但是,程序员只有两只手,那么吃零食和敲代码是不能同时进行了,需要加一个线程锁:
#! /usr/bin/env python #coding=utf-8 ''' 吃零食比较耗时间,但是程序猿有两只手,那么吃零食和打代码不能同时进行, 那么这里加个线程锁 线程同步就是为了防止这个,同时也引入了锁的概念.Lock和Rlock可以实现线程同步.这两个对象都有 acquire方法和release方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间. 你可以理解为这两个方法之间的东西会被锁定. ''' import time import threading #打开线程锁 lock = threading.Lock() class MyThread(threading.Thread): def __init__(self,target,args,name=''): threading.Thread.__init__(self) self.name = name #self.func = func self.target = target self.args = args def run(self): #某某线程要开始了 print(self.name + "开始了#######") if self.name == "听歌线程": matter1(music) elif self.name == "打码线程": matter2(number) elif self.name == "零食线程": matter3(snacks) print(self.name + "结束了########") def matter1(music): for i in range(0,len(music)): print("第" + str(i+1) + "首歌是:" + str(music[i])) #假设每一首歌曲的时间是2s time.sleep(2) print("切换下一首歌...") def matter2(number): #获取锁,成功获得锁定后返回True,可选的timeout参数不填时将一直阻塞直到获得锁定 lock.acquire() j = 1 while j <= number: print("我准备写入第" + str(j) + "行代码") j = j+1 #假设每一行代码的时间为1s time.sleep(1) print("写下一行代码...") ##释放锁,开始下一个线程 lock.release() def matter3(snacks): lock.acquire() for i in range(0,len(snacks)): print("我正在听着歌吃" + str(snacks[i]) + "零食") #假设没吃一袋零食间隔为5s time.sleep(5) print("吃完一包零食") lock.release() if __name__ == '__main__': #设定我要听的歌曲为 music = ['music1','music2','music3'] #设定我要打码的行数 number =4 #设定我要吃的零食为 snacks = ["辣条","可乐"] #开始时间 start = time.time() thing1 = MyThread(matter1,music,"听歌线程") thing2 = MyThread(matter2,number,"打码线程") thing3 = MyThread(matter3,snacks,"零食线程") thing1.start() thing2.start() thing3.start() thing1.join() thing2.join() thing3.join() #结束时间 end = time.time() print("完成的时间为:",str(end - start))
完成时间:
完成的时间为: 14.000801086425781
结果:
听歌线程开始了####### 第1首歌是:music1 打码线程开始了####### 我准备写入第1行代码 零食线程开始了####### 写下一行代码... 我准备写入第2行代码 切换下一首歌... 第2首歌是:music2 写下一行代码... 我准备写入第3行代码 写下一行代码... 我准备写入第4行代码 切换下一首歌... 第3首歌是:music3 写下一行代码... 打码线程结束了######## 我正在听着歌吃辣条零食 切换下一首歌... 听歌线程结束了######## 吃完一包零食 我正在听着歌吃可乐零食 吃完一包零食 零食线程结束了######## 完成的时间为: 14.000801086425781