• 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
  • 相关阅读:
    汤圆只有汤没有圆了,过了过了
    CommonJS
    What is Socket.IO?
    白话PGP/GPG
    汤圆只有汤没有圆了,过了过了
    npm for nodejs
    Running Daemontools under Ubuntu 8.10
    ubuntu seahouse
    node.js入门
    my blog zen :分享所学,backup一切~
  • 原文地址:https://www.cnblogs.com/R-bear/p/7724951.html
Copyright © 2020-2023  润新知