45.python之线程锁

线程锁

  • 前面在创建多线程的时候发现,线程的执行顺序有时会变乱,或者2个打印语句会打印在同一行,要想多线程不乱,可以使用线程锁
  • 加上线程锁后,同一时间只会执行一个线程,也就是线程独占资源
  • 要注意,锁不能滥用,若是因为某些原因没有解锁,就会造成死锁的现象,这样后面的线程也就无法执行。

模块threading中的Lock

用法:

import threading

lock = threading.Lock()

线程锁的加锁和解锁
在这里插入图片描述

例1:不加锁

import threading
import time
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import wait

def test(count):
    print(f'count={count},线程名称是:{threading.current_thread().name}')
    time.sleep(1)
    return count

if __name__ == '__main__':
    # 主线程开始时间
    start_time = time.time()

    # 创建线程池,里面有2个线程
    t = ThreadPoolExecutor(2)

    # 往线程池中添加任务
    task = [t.submit(test, i) for i in range(4)]

    # 等待线程池中任务执行完后再执行主线程
    wait(task)

    print(f'时间间隔是:{time.time()-start_time},当前线程名称是:{threading.current_thread().name}')

结果:
在这里插入图片描述

例2:加锁

import threading
import time
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import wait

def test(count, lock):
    # 加锁
    lock.acquire()
    print(f'count={count},线程名称是:{threading.current_thread().name}')
    time.sleep(1)
    # 解锁
    lock.release()
    return count

if __name__ == '__main__':
    # 创建线程锁
    lock = threading.Lock()

    # 主线程开始时间
    start_time = time.time()

    # 创建线程池,里面有2个线程
    t = ThreadPoolExecutor(2)

    # 往线程池中添加任务
    task = [t.submit(test, i, lock) for i in range(4)]

    # 等待线程池中任务执行完后再执行主线程
    wait(task)

    print(f'时间间隔是:{time.time()-start_time},当前线程名称是:{threading.current_thread().name}')

结果:

  • 未加锁时主线程执行时间是4s,线程池中的线程同一时间执行2个线程
  • 加锁后主线程执行时间是2s,线程池中的线程同一时间执行一个子线程
  • 加锁后避免了线程间的资源抢占
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值