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
  • 相关阅读:
    Centos 7 安装配置
    日常问题
    Fluent_Python_Part1序幕,01-data-model, 数据模型
    计算机基础
    dist-packages vs site-packages
    斗地主 (NOIP2015 Day1 T3)
    字串变换 (2002 年NOIP全国联赛提高组)
    搜索
    关于动态最大子段和--线段树查询
    Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'company' in 'class java.lang.String'
  • 原文地址:https://www.cnblogs.com/chenhaiming/p/9914943.html
Copyright © 2011-2022 走看看