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
  • 相关阅读:
    Hibernate 4.3.5 JPA实现的常见错误
    Jboss7.1中部署webservice的问题-1
    VS2015 无法启动 IIS Express Web 服务器 解决方案
    Git命令实现本地文件推送到git仓库
    VSCode 首次打开提示“Git installation not found.”解决方案
    VB6 对象库未注册问题
    【使用WCF,发布服务端浏览报错】未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089” 中加载类型 “System.ServiceModel.Activation.HttpModule”。
    设计模式一一单例模式
    设计模式一一适配器模式
    .NET Framework 各版本区别(简介)
  • 原文地址:https://www.cnblogs.com/chenhaiming/p/9914943.html
Copyright © 2011-2022 走看看