python进阶(4)

一世执手 提交于 2019-11-28 07:18:34

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 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!