python-多线程趣味(锁)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于python-多线程趣味(锁)的主要内容,如果未能解决你的问题,请参考以下文章

python多线程

python趣味详解多线程

起底多线程同步锁(iOS)

python多线程编程—同步原语入门(锁Lock信号量(Bounded)Semaphore)

python GIL锁

python学习(三十二)线程锁&守护线程&多进程