python进阶(4)

python进阶(4)

线程

线程的注意点

子线程之间共享全局变量,就会造成资源的争抢问题

互斥锁的问题

问题:

因为线程之间共享全局变量,所以,在多线程几乎在同时运行的时候,几乎同时修改同一全局变量的时候没,就要进行控制

此时,需要互斥锁

当某个线程需要修改资源的时候,先将资源进行锁定,其他线程不能修改该线程

当线程修改完成之后,并且释放完互斥锁之后,其他的线程才可以使用

互斥锁保证当前只有一个线程可以使用修改同一个资源

import threading
num = 0

def add_num1():
    global num
    for i in range(10000000):
        lock.acquire(True)
        num += 1
        lock.release()
    print('子线程1已经完成,此时得到的num1',num)

def add_num2():
    global num
    for i in range(10000000):
        lock.acquire()
        num += 1
        lock.release()
    print('子线程2已经完成,此时得到的num2',num)

if __name__ == '__main__':
    lock = threading.Lock()
    thread1=threading.Thread(target=add_num1)
    thread2=threading.Thread(target=add_num2)
    thread1.start()
    thread2.start()

注意点:

  1. 确保了关键代码只能由一个线程从头到尾完整的执行完成
  2. 阻止了多线程的并发操作,包含锁的代码,其实还是单线程执行的,效率下降
    • 如果当前的程序出现了多个锁,可能会出现死锁问题
死锁的问题

避免死锁的方法:

  1. 超时释放
  2. 设计的时候,避免死锁
线程安全
from queue import Queuefrom 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值