同步锁(28-2)

只要是线程就会有锁!
GIL锁:控制的CPU执行一次只能执行一个线程。
自己加锁:确保执行完一个线程,才会切换下一个线程。

# 一个数字100,让100次线程执行-1操作,最后结果为0
# 因为每一个线程中没有任何阻塞或者time.sleep()

import
threading
def SubNum():  # 定义一个减法函数
  global num   # 在函数内操作全局变量
  num -=1    # -1操作

num = 100    # 全局变量100

thread_list = []  # 储存100个线程

for i in range(100):  # 执行100次线程
  t = threading.Thread(target=SubNum,)
  t.start()
  thread_list.append(t)  # 执行的每一个线程都添加到一个空列表里去

for t in thread_list:  # 遍历所有线程
  t.join()
print("最后一个数字:", num)  # 执行完100线程后的num
  

----------------------------------------------------------------------------------------------------------------------------------

多一步操作

import time
import threading

def SubNum():
  global num
  temp = num  # 多了一步操作,CPU花的时间比较就多一点
  time.sleep(0.0001)  # CPU切换线程
  num = temp-1

num = 100

thread_list = []
for i in range(100):
  t = threading.Thread(target=SubNum,)
  t.start()
  thread.append(t)

for t in thread_list:
  t.join()
print("最后一个数字:", num)

运行结果:
最后一个数字:91  # 数字不固定

 -----------------------------------------------------------------------------------------------------------------------------------

同步锁:

遇到任何阻塞或者time.sleep()都会执行完才切换线程。

import time
import threading

def SubNum():
  dlobal num
  r.acquire()  # 2 打开这把锁
  temp = num
  time.sleep(0.0001)
  num = temp-1
  r.release()  # 3 释放这把锁

num = 100
r = thread.Lock()  # 1 定义一个锁
thread_list = []
for i in range(100):
  t = threading.Thread(target=SubNum)
  t.start()
  thread_list.append(t)

for t in thread_list:
  t.join()      # 所有线程执行完才执行后面代码
print("最后一个数字:",num)

运行结果:

最后一个数字:0

原文地址:https://www.cnblogs.com/uncle-kay/p/9614617.html