python高级-线程
线程
什么是线程:
线程,有时被称为轻量进程(Lightweight
Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
python如何实现多线程:threading
实现一个多线程:导入threading模块中的Thread类
构造一个Tread类的对象
对象.start()启动线程
线程类的实现:
1、继承threading.Thread
2、重写overrid run方法
3、实例化当前类的对象,调用start()
GIL Global Interpreter Lock+
多线程中的全局变量共享问题
多线程并发操作全局变量问题
非线程安全问题
并发导致非线程安全问题
互斥锁:mutex
互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享资源与某个特定互斥锁在逻辑上绑定(要申请该资源必须先获取锁)。
(1)访问公共资源前,必须申请该互斥锁,若处于开锁状态,则申请到锁对象,并立即占有该锁,以防止其他线程访问该资源;如果该互斥锁处于锁定状态,则阻塞当前线程。
(2)只有锁定该互斥锁的进程才能释放该互斥锁,其他线程试图释放无效。
同步:
在两个或多个数据库、文件、模块、线程之间用来保持数据内容一致性的机制。
线程同步解决的是在一个程序中多个线程之间的关系的协调,对竞争资源的访问的一种处理方式,避免一个线程长期占用一个资源的目的。有synchronized,lock ,volatile,消息传递机制等处理方式达到线程同步。比如在java中使用synchronized关键字修饰一个方法,用这个关键字修饰的方法称为“同步方法”,语法:访问控制符 +synchronized + 返回值类型(参数列表) +方法体;具有这个关键字的方法有一个重要的特性,就是该方法每次只能有一个线程执行这个方法;后来的线程处于挂起状态,直到前面的调用该方法的线程退出该方法,才能调用调用该方法体执行。
死锁:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
消费者和生产者模型:
产生数据的模块称为生产者,处理数据的模块称为消费者,生产者和消费者之间的中介就叫做缓冲区。生产者(供货商)产生的数据不得不交给另一模块(消费者)来对其进行处理,在这之间必须要有一个类似与超市的东西来存储数据,这就是抽象的生产者/消费者模型。
消费者和生产者模型.png