一、先用一个例子说明没有用锁的时候,达到的效果错误:

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

 

posted on 2018-11-06 14:05  老π  阅读(540)  评论(0编辑  收藏  举报