zoukankan      html  css  js  c++  java
  • pythonの递归锁

    首先看一个例子,让我们lock = threading.Lock() 时(代码第33行),程序会卡死在这里

     1 #!/usr/bin/env python
     2 import threading,time
     3 
     4 
     5 def run1():
     6     print("grab the first part data")
     7     # 申请锁
     8     lock.acquire()
     9     # 将全局的变量,在此声明一下
    10     global  num
    11     num += 1
    12     # 释放锁
    13     lock.release()
    14     return  num
    15 def run2():
    16     print("grab the second part data")
    17     lock.acquire()
    18     global  num2
    19     num2 += 1
    20     lock.release()
    21     return  num2
    22 def run3():
    23     lock.acquire()
    24     res = run1()
    25     print("between run1 and run2")
    26     res2 = run2()
    27     lock.release()
    28     print(res,res2)
    29 
    30 if __name__ == "__main__":
    31     num,num2 = 0,0
    32     # 递归锁
    33     lock = threading.Lock()
    34     for i in range(10):
    35         t = threading.Thread(target=run3)
    36         t.start()
    37 
    38 while threading.active_count() != 1:
    39     print(threading.active_count())
    40 
    41 else:
    42     print("all threads done")
    43     print(num,num2)

    如果我们将其改为lock = threading.RLock(),那么程序就能正常运行,这个就是递归锁  RLock()

     1 #!/usr/bin/env python
     2 import threading,time
     3 
     4 
     5 def run1():
     6     print("grab the first part data")
     7     # 申请锁
     8     lock.acquire()
     9     # 将全局的变量,在此声明一下
    10     global  num
    11     num += 1
    12     # 释放锁
    13     lock.release()
    14     return  num
    15 def run2():
    16     print("grab the second part data")
    17     lock.acquire()
    18     global  num2
    19     num2 += 1
    20     lock.release()
    21     return  num2
    22 def run3():
    23     lock.acquire()
    24     res = run1()
    25     print("between run1 and run2")
    26     res2 = run2()
    27     lock.release()
    28     print(res,res2)
    29 
    30 if __name__ == "__main__":
    31     num,num2 = 0,0
    32     # 递归锁
    33     lock = threading.RLock()
    34     for i in range(10):
    35         t = threading.Thread(target=run3)
    36         t.start()
    37 
    38 while threading.active_count() != 1:
    39     print(threading.active_count())
    40 
    41 else:
    42     print("all threads done")
    43     print(num,num2)
  • 相关阅读:
    Jsp数据交互
    java生成验证码
    http状态码
    Java设计模式之单例
    QQ数据库管理
    Mysql中的存储过程,事物
    mysql中约束的添加,修改,与删除
    mysql中定义存储过程
    Mysql中的子查询等操作
    数据库的简单操作
  • 原文地址:https://www.cnblogs.com/pengpengzhang/p/9577289.html
Copyright © 2011-2022 走看看