一、先用一个例子说明没有用锁的时候,达到的效果错误:
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