1.全局锁 GIL
在任意一个指定的时间中,有且仅有一个线程在运行 -> 线程比较安全
2.线程复杂度较高,通常不建议使用
3.使用在 数据库线程池,数据库连接池,
4.不要大量使用线程,修改难度稍大
mlock = threading.Lock()
5.互斥锁
加锁 acquire
mlock.acquire()
释放锁 release
mlock.release()
加锁后释放,不释放会发生死锁
如:打开一个文件后 不希望别人修改
6. mlock = threading.RLock()
当存在死锁时,防止死锁 可重用锁,加锁和释放锁可以多个使用在同一个函数中
程序:
# 测试,线程是否安全
import threading
num = 0
def t():
global num
num += 1
print(num)
for i in range(0,6):
d = threading.Thread(target = t)
d.start()
# 可以按序输出
import threading
import time
def func_a():
print("a 函数开始")
time.sleep(2)
print("a 函数结束")
def func_b():
print("b 函数开始")
time.sleep(2)
print("b 函数结束")
b_time = time.time()
func_a()
func_b()
print(time.time() - b_time)
# 查看运行多少秒
import threading
_a = threading.Thread(target = func_a)
_b = threading.Thread(target = func_b)
_a.start()
_b.start()
# 开始
_a.join()
_b.join()
# 等待
print(time.time() - b_time)
# 查看时间
# 加锁和释放
import threading
mlock = threading.Lock()
# 创建一把锁, mlock 名
# mlock = threading.RLock()
# 当存在死锁时,防止死锁 可重用锁
num = 0
def a():
global num
mlock.acquire()
# 加锁
num += 1
mlock.release()
# 释放锁
print(num)
for i in range(10):
d = threading.Thread(target = a)
d.start()
2020-04-12