多线程复习2

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

猜你喜欢

转载自www.cnblogs.com/hany-postq473111315/p/12686171.html