【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种方式】
【加群交流】