• Python 线程(二):简单锁实现线程同步


    Python中有两种锁,一个锁是原始的锁(原语), 不可重入,而另一种锁则是可重入的锁即递归锁。而是thread模块中,只提供了不可重入的锁,而在threading中则提供这两种锁。

    可重入:当一个线程拥有一个锁的使用权后,再次获取锁的使用权时,不会阻塞,会立马得到使用权,则原始锁的话,则不行,会阻塞。

    方法一:thead的不可重入锁

      

    import thread
    import time
    
    lock = thread.allocate_lock()
    
    def Count(id):
        global num;
    
        while True:
            lock.acquire()
            if num <= 10:
                print "Thread id is : %s     The num is %s
    " % (id, str(num))
                num = num + 1
            else:
                break
            lock.release()
        else:
            thread.exit_thread()
    
    if __name__ == "__main__":
        num = 1
        thread.start_new_thread(Count, ('A',))
        thread.start_new_thread(Count, ('B',))
    
        time.sleep(5)
    

      

    方法二:theading的Lock(不可重入锁)

    import threading
    import time
    
    lock = threading.Lock()
    
    def Count(id):
        global num;
    
        while True:
            lock.acquire()
            if num <= 10:
    
                print "Thread id is : %s     The num is %s
    " % (id, str(num))
                num = num + 1
            else:
                break
            lock.release()
    
    if __name__ == "__main__":
        num = 1
        t1 = threading.Thread(target=Count, args=('A', ))
        t2 = threading.Thread(target=Count, args=('B', ))
    
        t1.start()
        t2.start()
    
        time.sleep(5)
    

      方法三:threading的RLock(可重入)

    import threading
    import time
    
    lock = threading.RLock()
    
    def CountNum(id):
        global num
        
        lock.acquire()
        
        if num <= 10:
            print "Thread id is : %s     The num is %s
    " % (id, str(num))
            num = num + 1
            CountNum(id)
    
        lock.release()
    
    if __name__ == "__main__":
        num = 1
        t1 = threading.Thread(target=CountNum, args=('A'))
    
        t1.start()
    
        time.sleep(5)
  • 相关阅读:
    Moya 浅析
    Swift: Alamofire -> http请求 & ObjectMapper -> 解析JSON
    ReactiveCocoa 用法实例
    RACSignal的Subscription深入
    idea 不能编译生成class文件
    idea 右下角不显示git分支
    SSO单点登录的研究
    JVM内存模型简介
    Spring事务处理
    RabbitMQ
  • 原文地址:https://www.cnblogs.com/wang-can/p/3581028.html
Copyright © 2020-2023  润新知