zoukankan      html  css  js  c++  java
  • PYTHON——多线程:同步锁:Lock

    一、先用一个例子说明没有用锁的时候,达到的效果错误:

    1、实例(没有锁的情况):

    import time
    import threading
    # 没有用锁的
    # 时候,出现多个线程拿到相同资源的现象。
    # 如下例中,共享资源变量num=100,我们开100个线程,每个线程将资源变量num减1,按正常情况,
    # 通过100个线程执行完后,最后num=0.但是由于线程用资源时,没有加锁,就出现某几个线程拿到的资源一样,
    # 如当num=50时,此时有两个线程同时拿到num=50这个资源,就会出现100个线程都减一后,最后num<>0,而是num=1
    # 这就是线程不安全。
    
    def addNum():
        global num
        # num -=1
    
        temp = num
        ## time.sleep(0.001)
        print('添加print函数,只是为了增加线程的cpu占用时间而已。也可以用上述sleep(0.01)')
        print('OK')
        num = temp-1
    
    num = 100 #设定一个共享变量,模拟共享资源,如后续的数据库
    thread_list = []
    for i in range(100):
        t = threading.Thread(target=addNum)
        t.start()
        thread_list.append(t)
    
    for i in thread_list: #主线程等待所有线程都执行完
        i.join()
    
    print('Final num:',num)

    执行效果:

    ......
    ......
    ......
    添加print函数,只是为了增加线程的cpu占用时间而已。也可以用上述sleep(0.01)
    OK
    添加print函数,只是为了增加线程的cpu占用时间而已。也可以用上述sleep(0.01)
    OK
    添加print函数,只是为了增加线程的cpu占用时间而已。也可以用上述sleep(0.01)
    OK
    Final num: 24

    python执行流程:

     二、在资源上加锁(达到目的)

    1、实例代码:

    import time
    import threading
    
    r = threading.Lock()   #创建一把锁
    
    def addNum():
        global num
        # num -=1
        r.acquire()  #把锁锁上
        temp = num
        print('添加print函数,只是为了增加线程的cpu占用时间而已。也可以用上述sleep(0.01)')
        print('OK')
        num = temp-1
        r.release()  #把锁打开
    
    num = 100 #设定一个共享变量,模拟共享资源,如后续的数据库
    thread_list = []
    for i in range(100):
        t = threading.Thread(target=addNum)
        t.start()
        thread_list.append(t)
    
    for i in thread_list: #主线程等待所有线程都执行完
        i.join()
    
    print('Final num:',num)

    2、执行结果:

    ......
    ......
    ......
    添加print函数,只是为了增加线程的cpu占用时间而已。也可以用上述sleep(0.01)
    OK
    添加print函数,只是为了增加线程的cpu占用时间而已。也可以用上述sleep(0.01)
    OK
    添加print函数,只是为了增加线程的cpu占用时间而已。也可以用上述sleep(0.01)
    OK
    Final num: 0
  • 相关阅读:
    网络七层协议
    discuz 使用ajax post方式传递数据,body中带有双引号会报非法字符
    处理Highcharts数据过多导致的tooltip提示框数据显示不全问题
    Python和Js打印心形
    合并区间问题
    一个继承的小问题
    kotlin学习(10)反射
    kotlin学习(9)注解
    kotlin学习(8)泛型
    kotlin学习(7)高阶函数
  • 原文地址:https://www.cnblogs.com/chenhaiming/p/9914943.html
Copyright © 2011-2022 走看看