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())
  • 相关阅读:
    java获取程序执行时间
    自己不去努力 还有谁能帮你
    错误: 找不到或无法加载主类 的解决办法
    不要迷信红黑树 哈希是一切
    nancy的诊断2
    nancy中的诊断功能面板1
    ironpython 2.75 在c#中的使用
    sqlserver2008创建数据库 报 Cannot read property is filestream 此属性不可用于sql server 7.0 解决
    结巴net 分词 配置文件路径,在网站中的出现问题的解决
    akka 练手 原来第一次是原封不动的返回传出去的参数
  • 原文地址:https://www.cnblogs.com/msj513/p/9937226.html
Copyright © 2011-2022 走看看