zoukankan      html  css  js  c++  java
  • 线程锁

    线程的互斥锁

    from threading import Thread,Lock
    # 创建一个互斥锁
    mutex = Lock()
    
    def task1():
        # 锁定
        mutex.acquire()
        for i in range(100):
            print("===================")
        # 打开
        mutex.release()
    def task2():
        mutex.acquire()
        for i in range(100):
            print("!!!!!!!!!!!!!!!!!!")
        mutex.release()
    
    def task3():
        mutex.acquire()
        for i in range(100):
            print("********************")
        mutex.release()
    
    t1 = Thread(target=task1)
    t2 = Thread(target=task2)
    t3 = Thread(target=task3)
    
    t1.start()
    t2.start()
    t3.start()

    死锁

    from threading import Thread,Lock
    import time,random
    
    mutex1 = Lock()
    mutex2 = Lock()
    def fun1():
        mutex1.acquire()
        print("抢到了锁1")
        time.sleep(1)
        mutex2.acquire()
        print("抢到了锁2")
    
        mutex2.release()
        print("释放了锁2")
    
        mutex1.release()
        print("释放了锁1")
    
    
    def fun2():
    
        mutex2.acquire()
        print("抢到了锁2")
    
        time.sleep(1)
    
        mutex1.acquire()
        print("抢到了锁1")
    
    
    
        mutex1.release()
        print("释放了锁2")
    
        mutex2.release()
        print("释放了锁1")
    
    # def fun3():
    #     fun1()
    #     fun2(
    
    t1 = Thread(target=fun1)
    t1.start()
    t2 = Thread(target=fun2)
    t2.start()
    View Code

    当两个线程正在争抢对方已经加锁的,所以只能等待对方释放锁

    死锁发生的条件 有多个线程 多个锁 如果只有一个锁 无论是LOCK RLOK 卡不死(前提是逻辑上没有错误)

    RLock 就算你的代码逻辑不对 同一个线程多次对一个锁执行acquire 也不会卡死

    RLock

    import time
    lock = RLock()
    # 对于同一个线程而言 可以多次acquire  其他线程会被阻塞
    def task():
        lock.acquire()
        for i in range(5):
            time.sleep(1)
            print(current_thread())
        lock.release()
    
    Thread(target=task).start()
    Thread(target=task).start()

    信号量

    Semaphore 相当于限制执行代码的线程数量

    默认为不限制

    from threading import Thread,Semaphore,current_thread,active_count
    import time
    sm = Semaphore(3)#
    
    def task():
        sm.acquire()#不限制线程的生成,但是限制当前执行函数的线程
        for i in range(5):
            time.sleep(0.1)
            print(current_thread())
        sm.release()
    
    def task1():
        for i in range(5):
            time.sleep(0.1)
            print(current_thread())
    
    
    for i in range(5):
        t = Thread(target=task)
        t1 = Thread(target=task1)
        t.start()
        t1.start()
    print(active_count())
  • 相关阅读:
    自定义key解决zabbix端口监听取值不准确的问题
    Redis——主从同步原理
    Leetcode 24——Swap Nodes in Pairs
    Struts2——第一个helloworld页面
    Leetcode 15——3Sum
    Leetcode 27——Remove Element
    C#简单入门
    Leetcode 12——Integer to Roman
    Leetcode 6——ZigZag Conversion
    eclipse如何debug调试jdk源码(任何源码)并显示局部变量
  • 原文地址:https://www.cnblogs.com/msj513/p/9937226.html
Copyright © 2011-2022 走看看