zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    MHA自动切换流程
    手写源码之 简单实现on emit off
    手写源码 -- bind,call,aplly
    多维数组转化为一维数组
    electron+vue中使用nodeJs的fs模块以及上传文件
    制作海报
    vue中引入播放器(百度播放器和腾讯云播放器)
    webpack配置
    webpack
    css样式
  • 原文地址:https://www.cnblogs.com/wang-can/p/3581028.html
Copyright © 2011-2022 走看看