zoukankan      html  css  js  c++  java
  • 守护进程,互斥锁,死锁现象以及信号量

    1 守护线程
    from threading import Thread,current_thread
    import time
    
    def task():
        print('%s is running' % current_thread().name)
        time.sleep(3)
        print('%s is done' % current_thread().name)
    
    if __name__ == '__main__':
        t1=Thread(target=task,name='第一个线程')
        t1.daemon = True
        t1.start()
        # time.sleep(5)
        t1.join()
    
    
    print('主线程')
    守护线程基本方式

    多个子线程的守护线程
    from threading import Thread
    import time
    def foo():
        print(123)
        time.sleep(5)
        print("end123")
    
    def bar():
        print(456)
        time.sleep(3)
        print("end456")
    
    if __name__ == '__main__':
    
        t1=Thread(target=foo)
        t2=Thread(target=bar)
    
        t1.daemon=True
        t1.start()
        t2.start()
        print("main-------")
    多个子线程守护线程

    总结:

    主进程:执行完代码就结束。
    主线程:所有子线程结束才结束。
    总结:只要进程内没有可执行的代码守护就结束。

    2 互斥锁

    注意一点:线程互斥锁可以放在全局名称空间,因为他们在同一个进程内,共享资源。
    from threading import Thread,Lock
    import time
    
    mutex=Lock()
    x=100
    
    def task():
        global x
        mutex.acquire()
        temp=x
        time.sleep(0.1)
        x=temp-1
        mutex.release()
    
    if __name__ == '__main__':
        start=time.time()
        t_l=[]
        for i in range(100):
            t=Thread(target=task)
            t_l.append(t)
            t.start()
        for t in t_l:
            t.join()
    
        print('',x)    #0
    print(time.time()-start)
    线程互斥锁

    3 死锁现象及解决方案 ——》递归锁
    注意点:mutex=Rlock 可以连续acquire,但只有其引用计数为0,其他线程才可以使用。
    from threading import Thread,Lock,RLock
    import time
    
    # mutexA=Lock()  #如果用Lock(互斥锁),会发生死锁现象
    # mutexB=Lock()
    
    mutexA=mutexB=RLock()  #是一把锁,可连续acqruie,但只有其上的计数为0时其他线程才可对其调用
    
    class MyThread(Thread):
        def run(self):
            self.f1()
            self.f2()
    
        def f1(self):
            mutexA.acquire()
            print('%s 拿到了A锁' %self.name)
    
            mutexB.acquire()
            print('%s 拿到了B锁' %self.name)
            mutexB.release()
    
            mutexA.release()
    
        def f2(self):
            mutexB.acquire()
            print('%s 拿到了B锁' %self.name)
            time.sleep(0.1)
    
            mutexA.acquire()
            print('%s 拿到了A锁' %self.name)
            mutexA.release()
    
            mutexB.release()
    
    
    if __name__ == '__main__':
        for i in range(10):
            t=MyThread()
            t.start()
    
    print('')
    死锁现象和递归锁

    4 信号量

    # from multiprocessing import Semaphore #进程和线程中皆可导入Semaphore模块
    from threading import Thread,Semaphore,current_thread
    import time,random
    
    sm=Semaphore(5)  #5把钥匙,即同时可以5个对象进行执行
    
    def go_wc():
        sm.acquire()
        print('%s 上厕所ing' %current_thread().getName())
        time.sleep(random.randint(1,3))
        sm.release()
    
    if __name__ == '__main__':
        for i in range(23):
            t=Thread(target=go_wc)
            t.start()
    信号量
  • 相关阅读:
    Swift学习——格式控制符和元组流程控制(二)
    boost::string 例题1
    钱币兑换问题
    我心目中的北京大学:从薛定格到王恩哥
    2.1-Java语言基础(keyword)
    【C语言天天练(十)】结构体
    JVM GC调优一则--增大Eden Space提高性能
    C++的一种业务分发方案(另类的工厂模式)
    Eclipse使用方法和技巧二十六:浅谈快捷键
    linux-shell脚本命令之grep
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9305930.html
Copyright © 2011-2022 走看看