这里演示的是一个报数的场景,100个人的队列进行报数,如果一起报肯定得不到真实的人数。那么体现在多线程中就是,在“报数”这个过程中,应该上一把锁,去保证每次只能有一个人报数,报完数拿到最新的人数之后,下一个人才能继续报数。下面是具体演示代码:
1、没上锁的:
from threading import Thread
from time import sleep
from random import uniform
counter = 0
def count_off():
global counter
new_count = counter + 1
count_time = uniform(0.1, 1)
sleep(count_time)
counter = new_count
def main():
threads = []
for _ in range(100):
t = Thread(target=count_off)
t.start()
threads.append(t)
for t in threads:
t.join()
print(counter)
if __name__ == '__main__':
main()
2、上锁的:
from threading import Thread, Lock
from time import sleep
from random import uniform
counter = 0
def count_off(lock):
lock.acquire()
try:
global counter
new_count = counter + 1
count_time = uniform(0.1, 1)
sleep(count_time)
counter = new_count
finally:
lock.release()
def main():
lock = Lock()
threads = []
for _ in range(100):
t = Thread(target=count_off, args=(lock,))
t.start()
threads.append(t)
for t in threads:
t.join()
print(counter)
if __name__ == '__main__':
main()
运行结果是,
没上锁的:1
上锁的:100
正常的,全局变量counter被多线程修改的话,并行的多个线程均只拿到了初始值(类比于100个人一起报数1,所以最后结果为1),加了锁之后,就只能一个个的报了,最后的人数也就是真实人数。