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向队列中加入元素
    在这里插入图片描述

代码:
在这里插入图片描述

在这里插入图片描述

4.4 利用ThreadLocal变量进行传递消息

4.4.1 前言

在这里插入图片描述

4.4.2 案例

在这里插入图片描述

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值