zoukankan      html  css  js  c++  java
  • 【Python高级编程016 ● 多任务编程 ● 线程同步的方式二:互斥锁 】


    ---------Python基础编程---------

    Author : AI菌


    【内容讲解】

    一、互斥锁的概念:
        互斥锁就是保证同一时刻只能有一个线程去操作共享数据,保证共享数据不会出现错误问题;
    二、互斥锁的好处:
        确保某段关键代码只能由一个线程从头到尾完整地去执行,
        保证多个线程访问共享数据不会出现数据错误问题。
    三、互斥锁的坏处:
        1、使用互斥锁会影响代码的执行效率,多任务改成了单任务执行;
        2、互斥锁如果没有使用好容易出现死锁的情况。
    四、互斥锁的使用:
        # threading模块中定义了Lock变量,
        # 这个变量本质上是一个函数,通过调用这个函数可以获取一把互斥锁
        ------------------------------------------------------------------
        # 创建锁
        lock = threading.Lock()
        # 上锁
        lock.acquire()
            这里编写代码能保证同一时刻只能有一个线程去操作, 对共享数据进行锁定
        # 释放锁
        lock.release()
        ------------------------------------------------------------------

    【代码演示】

    """
    一、互斥锁的概念:
        互斥锁就是保证同一时刻只能有一个线程去操作共享数据,保证共享数据不会出现错误问题;
    二、互斥锁的好处:
        确保某段关键代码只能由一个线程从头到尾完整地去执行,
        保证多个线程访问共享数据不会出现数据错误问题。
    三、互斥锁的坏处:
        1、使用互斥锁会影响代码的执行效率,多任务改成了单任务执行;
        2、互斥锁如果没有使用好容易出现死锁的情况。
    四、互斥锁的使用:
        # threading模块中定义了Lock变量,
        # 这个变量本质上是一个函数,通过调用这个函数可以获取一把互斥锁
        ------------------------------------------------------------------
        # 创建锁
        lock = threading.Lock()
        # 上锁
        lock.acquire()
            这里编写代码能保证同一时刻只能有一个线程去操作, 对共享数据进行锁定
        # 释放锁
        lock.release()
        ------------------------------------------------------------------
    """
    
    # 定义两个函数,实现循环100万次,每循环一次给全局变量加1
    # 创建两个子线程执行对应的两个函数,查看计算后的结果
    # 如果计算过程不出错,两个子线程执行完毕,全局变量的值应该是200万
    
    import threading
    
    # 定义全局变量
    g_num = 0
    # 创建互斥锁,本质上是一个函数
    lock = threading.Lock()
    
    
    # 循环1000000次,每循环一次给全局变量加1
    def calc_num1():
        # 操作共享数据之前要上锁
        lock.acquire()
        # 声明此处加上global表示要修改全局变量的内存地址
        global g_num
        for i in range(1000000):
            g_num += 1
    
        print("calc_num1:", g_num)
        # 共享数据操作完以后要释放所
        lock.release()
    
    
    # 循环1000000次,每循环一次给全局变量加1
    def calc_num2():
        # 操作共享数据之前要上锁
        lock.acquire()
        # 声明此处加上global表示要修改全局变量的内存地址
        global g_num
        for i in range(1000000):
            g_num += 1
    
        print("calc_num2:", g_num)
        # 共享数据操作完以后要释放所
        lock.release()
    
    
    if __name__ == '__main__':
        # 创建第一个子线程
        first_thread = threading.Thread(target=calc_num1)
        # 创建第二个子线程
        second_thread = threading.Thread(target=calc_num2)
    
        # 启动线程执行任务
        first_thread.start()
        second_thread.start()

    【运行结果】

    calc_num1: 1000000
    calc_num2: 2000000

    【往期精彩】

    ▷【Python基础编程196 ● 读取文件的4种方式】
    ▷【Python基础编程197 ● 读取文件的4种方式】
    ▷【Python基础编程198 ● 读取文件的4种方式】
    ▷【Python基础编程199 ● Python怎么读/写很大的文件】
    ▷【Python基础编程200 ● 读取文件的4种方式】
    ▷【Python基础编程201 ● 读取文件的4种方式】
    ▷【Python基础编程202 ● 读取文件的4种方式】
    ▷【Python基础编程203 ● 读取文件的4种方式】

    【加群交流】



  • 相关阅读:
    import和require的区别
    React Native--Animated:`useNativeDriver`is not supported because the native animated module is missing
    XMLHttpRequest
    react-native中更改android/ios的入口文件
    react-native 跳转到ios/android 权限设置界面
    CocoaPods安装和使用
    React、React Native面试题
    UIBarButtonSystemItem 样式
    (转)自定义UITabBar
    ios 代码规范
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/13622133.html
Copyright © 2011-2022 走看看