• python的线程锁


    1、先看一个例子,一个进程可以起多个线程,多个线程都共享这个线程的内存
    
    import threading
    import time
    
    num = 100
    thread_lock = threading.Lock()
    '''
    def add_func():
        global num
        print("Begin--->",num)
        num -= 1
        # thread_lock.release()
    '''
    #上面这段代码的结果,如果起100个线程去执行这个函数,那么第一个线程执行完后nun为99,这个时候第二个线程去拿num,拿到的值就是99,第三个线程拿到的值就是98.......
    
    '''
    def add_func():
        global num
        print("Begin--->", num)
        time.sleep(0.1)
        num -= 1
    '''
    #上面这段代码的意思是,因为第一个线程和第二个线程之间有sleep,sleep后才去进行减操作,所以所有线程拿到的num的值都是100,最终执行的结果不是100-1,而是num-1,而这个num
    #就是上一个线程执行完后的num的,所以我们看到所有线程拿到的值都是100,但是最后num的值确实0
    
    #老师也没有讲清楚,上面的例子不加锁,结果也一直是正确的,但是在python2中,有时候会得到不一样的值,但是在python3则一直不会报错,为了避免出问题,我们可以对这个操作加锁
    
    lock = threading.Lock()
    #创建一个锁的实例
    
    def add_func():
        global num     #获取公共变量num
        print("Begin--->", num)
        time.sleep(1)
        print("after--->",num)
    
        #对下面的语句加锁或者获取一把锁,也就是同一个时间只有个线程可以执行下面的语句
        lock.acquire()
        num -= 1
        # lock.release()
        #用完之后就必须要释放锁,不然程序无法往下执行
    
    
    
    
    thread_list = []
    for i in range(100):
        t = threading.Thread(target=add_func)
        t.start()
        time.sleep(1)
        thread_list.append(t)
    
    for t in thread_list:
        t.join()
    
    print("over--->",num)
    

      

  • 相关阅读:
    java 多线程2
    java 多线程1
    java Object
    java 模板
    03015_JSTL技术
    运维人员常用的Linux命令总结
    oracle的userenv和nls_lang详解
    Oracle字符集检查和修改
    sql语句中(+)的作用
    Oracle事务Transaction
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/7253003.html
Copyright © 2020-2023  润新知