python多线程
1. 线程概念
- 是进程中一个单一联塑控制流程,即单一的执行路径
- 又被称为轻量级进程
- 一个进程可以拥有多个并行的线程
- 一个进程中的线程共享相同的内存单元/内存地址空间,即可以访问相同的变量和对象,而且它们从同一个堆中分配对象,即可以进行通信,数据交换和同步操作
- 由于线程间在同一个地址空间上进行,因此不需要额外的通信机制,就可以更加方便的进行信息传递和通信。
2. 进程和线程区别
3. python创建多线程
以后利用threading多一些。
3.1 利用threading进行方法传递创建线程
- 代码
运行结果:
主线程要等所有线程结束后,才会结束。
3.1.1 查看当前线程数量
threading.enumerate()可以查看当前线程的数量
- 代码:
运行结果:
- 交错执行
3.2 利用类继承的方式创建线程
3.2.1 声明
- 继承thrading.Thread
- 重写run方法
3.2.2 调用
- 创建线程对象
- 调用start方法
执行结果:
如果需要传参,则利用__init__方法:
3.3 线程的状态
- 三个状态:
就绪 阻塞 运行
- 阻塞状态不能直接进入运行,需要进入就绪再进入运行,运行可以进入阻塞状态。
- 可以通过优先级调用线程。
4. 线程间的通信
4.1 共享全局变量
4.1.1 前言
4.1.2 案例
- 代码
运行结果:
4.1.3 利用传参方式使用全局变量
-
代码1: 传入不可变类型
运行结果:
上述代码中,传入操作的是局部变量。 -
代码2: 传入可变类型
运行结果:
传入可变类型,其实传入的是地址。
4.2 线程安全问题–线程同步问题
未对全局变量进行保护,造成各个线程对全局变量修改混乱。
4.2.1 案例
- 代码
- 结果
- 解释:
g_num +=1做了两个事情:先进行g_num+1(CPU从内存将g_num中值读到寄存器中读取g_num值,然后+1),然后对g_num进行赋值(在内存中对g_num进行赋值)。即CPU进行了如下操作:
上述三步操作不应该被拆开。
线程不安全表现在:
各个线程在进行上述三步操作时混乱进行,交叉进行了。导致最终结果产生混乱。
为了线程安全,则需要加入机制保证每个线程的上述三步一次进行,不会被打乱(原子性)
4.2.2 线程同步 – 给线程加锁
保证每个线程做事情不会被打断。
- 创建锁
- 锁定
- 释放
4.2.3 死锁
-
前言
-
代码
4.2.4 利用锁控制线程依次执行
运行结果:
循环执行。
4.3 利用Queue在多线程进行传递数据
4.3.1 前言
比较适合消费者和生产者模式。
4.3.2 使用
- get向队列中取出元素
- put向队列中加入元素
代码: