python-面向运行时性能优化-threading

news2025/1/16 0:20:58

python-面向运行时性能优化-threading

  • 一:线程基础
    • 1> 线程状态
    • 2> 线程同步
      • 1. 锁的状态
    • 3> 线程通信-条件变量
    • 4> 线程阻塞-之间转换
      • 1. 阻塞分类
  • 二:threading类
    • 1> threading介绍
    • 2> Thread类
      • 1. Thread的生命周期
      • 2. 实例化Thread类
      • 3. 继承Thread类
      • 4. Thread构造
        • A: start方法
        • B: run方法
        • C: join方法
        • D: setDaemon方法
        • E: Thread实例的其他属性和方法
    • 3> Lock&Rlock类
      • 1. Lock和RLock类介绍
      • 2. Lock&RLock demo
    • 4> Condition类
      • 1. 构造方法
      • 2. 实例方法
      • 3. Condition demo
    • 5> Event类
      • 1. 构造方法
      • 2. 实例方法
      • 3. Event demo
    • 6> Semaphore类
      • 1. 构造方法
      • 2. Semaphore demo
    • 7> Timer类
      • 1. 构造方法
      • 2. Timer demo
    • 8> local类
      • 1. local -本地对象理解
      • 2. local demo
      • 3. 主线程与子线程local 的访问区别
  • 三:threading模块方法
    • 1> 方法分类
    • 2> threading demo
  • 四: multi threading
    • 1> 线程创建 demo
    • 2> 线程同步 demo
    • 3> 线程池 demo
      • 1. Concurrent.futures-Executor
      • 2. with ThreadPoolExecutor –上下文
      • 3. Exectuor -常用方法
      • 4. Future -方法
      • 5. 线程池-步骤
      • 6. 线程池 demo
      • 7. result()-获取执行结果
        • A: add_done_callback()
    • 4> 注意事项

一:线程基础

1> 线程状态

线程有五种状态:新建、就绪、运行、阻塞、死亡
在这里插入图片描述

2> 线程同步

因为线程同时运行多个任务,但实际上还是cpu以极快的速度在每个线程之间转换处理任务;对于python这种高级语言,每条语句未一次执行完成,因此,在语句执行过程中,还未结束test1任务,cpu就运行其他的线程任务test2,这可能会导致公共资源发生不好的变化,会导致数据不同步,因此引用了锁的概念,避免重要数据在处理时被打断或者其他线程篡改;

1. 锁的状态

锁有两种状态——锁定、未锁定,当锁定的时候,其他的线程执行到锁定的部分,需要请求锁,但是锁一次只供给一条线程,等这条先线程执行到释放锁的时候,其他的等待(被阻塞)的线程中,才有一条线程可以获得锁(线程进行竞争来获取锁,不知道那线程得到锁),然后继续执行、释放等,这样的话重要数据的操做会完整执行,保证了数据的同步。

线程和锁的关系
在这里插入图片描述

3> 线程通信-条件变量

线程同步使用了锁,保证了只让一条线程执行,其他等待,我们认为其他的线程被阻塞了,且这些线程的等待是被动的,释放锁后会立刻竞争锁;
**条件变量:**允许在不满足条件的时候,线程进入等待,当其他线程创造条件后,发出通知,线程挂起状态运行,收不到通过通知,就会一直挂着;
当一个线程得到锁定后,判断是否满足条件。如果不满足,则回到等待池(此时自动解锁),等待条件满足的通知,然后收到通知后,请求锁定,直到获得锁定,条件满足,继续执行,然后释放锁给其它线程;

挂起相对于阻塞来说,可以看为是一个主动的行为,因为如果一致不满足,及时锁释放了,被挂起的线程也不会取竞争锁
在这里插入图片描述
当满足某种条件后,认为需要唤醒等待线程来执行任务,就可以使用 nodify() 后者nodify_all()唤起一条或所等待池中的线程
在这里插入图片描述

4> 线程阻塞-之间转换

在这里插入图片描述

1. 阻塞分类

阻塞有三种

分类 注释
同步阻塞 指处于竞争锁定的状态,线程请求锁定时将进入这个状态,一旦成功获得锁定又恢复到运行状态;
等待阻塞 指等待其他线程通知的状态,线程获得条件锁定后,调用“等待”将进入这个状态,一旦其他线程发出通知,线程将进入同步阻塞状态,再次竞争条件锁定;
其他阻塞 指调用time.sleep()、anotherthread.join()或等待IO时的阻塞,这个状态下线程不会释放已获得的锁定;

二:threading类

1> threading介绍

介绍内容 注释
概述 threading用于提供跟线程相关的操作,线程是应用程序中工作的最小单元
threading模块提供的类 Thread、Lock、Rlock、Condition、Semaphore、Event、Timer、local
threading模块提供的 常用方法 threading.currentThreading()  返回现在进行的线程变量;threading.enumerate()  返回当前正在运行的所有进程的列表;threading.activeCount()  返回活跃的线程的数量,与len(threading.enumrate())相同;

2> Thread类

Thread类是threading标准库中最重要的一个类。
你可以通过实例化Thread类,创建Thread对象,来创建线程。
你也可以通过继承Thread类创建派生类,并重写__init__和run方法,实现自定义线程对象类

1. Thread的生命周期

序列 含义
1 创建对象时,代表Thread内部被初始化
2 调用start()方法后,thread会开始运行
3 thread代码正常运行结束或者遇到异常,线程会终止。
4 可以通过Thread的is_alive()方法查询线程是否还在运行。is_alive() 返回 True 的情况是 Thread 对象被正常初始化,start() 方法被调用,然后线程的代码还在正常运行

2. 实例化Thread类

将要执行的方法,作为一个参数,在实例化Threading类的时候,作为目标直接传入

import threading
import time

def test(x, y):
    print('%s is current thread!'%threading.current_thread())
    time.sleep(2)
    print('%s is ending!'%threading.current_thread())
    print(x + y)

for i in range(4):
    thread1 = threading.Thread(target=test, name&#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.11作业

实现一个对数组求和的函数,数组通过实参传递给函数 sum0 arr(11 22 33 44 55) Sum() {for i in ${arr[*]}do$((sumi))donereturn $sum } Sum ${arr[*]} var$? echo $var写一个函数,输出当前用户的uid和gid,并使用变量接收结果 Sum() {aid -…

C高级作业 【使用shell脚本】 实现一个对数组求和的函数,数组通过实参传递给函数+写一个函数输出当前用户的uid和gid,并使用变量接收结果

作业 1、实现一个对数组求和的函数,数组通过实参传递给函数 #!/bin/bash # 定义求和函数 function sum() {local arr("$") # 将传入的参数保存到一个数组中local sum0 # 初始化求和为0# 遍历数组元素进行求和for num in "${arr[]}";dosum$…

零代码编程:用ChatGPT批量合并ts文件

文件夹中有很多个ts后缀的视频文件,要合并成一个视频文件,在ChatGPT中可以这样输入提示词: 你是一个Python编程专家,要完成一个批量合并ts文件的任务,具体步骤如下: 打开文件夹:C:\Users\dell\…

亚马逊测评下单怎么操作?有没有自动下单软件?

想要进行亚马逊的测评下单,可以按照以下步骤进行操作: 首先,在亚马逊官方网站上搜索你感兴趣的产品,选择你喜欢的产品并查看其详细信息、价格以及其他用户的评价,确认你的购买意向后,点击“加入购物车”将…

C高级 shell指令分支和循环

实现一个对数组求和的函数,数组通过实参传递给函数 #!/bin/bash s0 function sum() {local brr($*)for i in ${brr[*]}do((si))doneecho $s } arr(1 2 3 4 5 6 7 8 9 ) sum ${arr[*]}写一个函数,输出当前用户的uid和gid,并使用变量接收结果 #…

Grafana配置邮件告警

1、创建一个监控图 2、grafana邮件配置 vim /etc/grafana/grafana.ini [smtp] enabled true host smtp.163.com:465 user qinziteng05163.com password xxxxx # 授权码 from_address qinziteng05163.com from_name Grafanasystemctl restart grafana-serv…

DAY03_瑞吉外卖——公共字段自动填充新增分类分类信息分页查询删除分类修改分类

目录 1. 公共字段自动填充1.1 问题分析1.2 基本功能实现1.2.1 思路分析1.2.2 代码实现1.2.3 功能测试 1.3 功能完善1.3.1 思路分析1.3.2 ThreadLocal1.3.3 操作步骤1.3.4 代码实现1.3.5 功能测试 2. 新增分类2.1 需求分析2.2 数据模型2.3 前端页面分析2.4 代码实现2.5 功能测试…

【算法】二分查找算法——leetcode二分查找、搜索插入位置

文章目录 二分查找704. 二分查找35. 搜索插入位置 二分查找 二分查找算法是一种在有序数组中查找特定元素的搜索算法。算法的工作原理是,通过比较数组中间元素和目标值,如果目标值等于中间元素,那么查找结束。如果目标值小于或大于中间元素&a…

单元测试界的高富帅,Pytest框架 (三) 用例标记和测试执行篇

pytest用例标记和测试执行篇 上一篇文章入门篇咱们介绍了pytest的前后置方法和fixture机制,这个章节主要给大家介绍pytest中的标记机制和用例执行的方法。pytest可以通过标记将数据传入于测试函数中,也可以通过标记中对执行的用例做筛选,接下…

NTC 温度采样 二分查表及公式法

NTC 温度采样: 本文记录对NTC 温度采样,分别采用二分查表法及公式法进行描述 资源下载链接:Excel 生成数组表 https://download.csdn.net/download/qq_41359157/88326839?spm1001.2014.3001.5503 NTC参数: NTC采样电路&#xf…

2023 年 Vue 最流行的动画库

数字世界以短暂的注意力和激烈的竞争为主导,因此必须立即将受众的注意力吸引到您的网站上。使用 Vue 动画库,您可以毫不费力地实现这一目标。据报道,VueJs 是 JavaScript 类别中第 7 大最受欢迎的,来自世界各地的开发人员使用它来…

arthas基本应用

下载 arthas curl https://arthas.aliyun.com/arthas-boot.jar启动 arthas(启动之前确保有一个 java进程服务) java -jar arthas-boot.jar输入3,再输入回车/enter。Arthas 会 attach 到目标进程上,并输出志: 输入das…

如何抢占3020亿美元市场先机?送你一份指南

印度电商市场规模正在快速增长。预计到2023年,印度电商市场规模将达到2000亿美元。其中,B2C电商市场规模将占据主导地位,预计将增长至1000亿美元。 此外,印度政府也在积极推动数字化发展,为电商企业提供更多机会。政府…

Python语言:算术运算符知识点讲解

前言:学了几天python,可把我折磨坏了。为什么呢,就是python语言都特别爱空格,我有时候就忘了,就报错了啦。就比如这个:a 8,等于号前面和后面都需要空格,有点不习惯,在慢…

Spring中的事务与事务传播机制

事务 在学习MySQL时我们学习过事务,而到了Spring的学习时,同样会学习到事务,两个东西的事务的定义都是一样的:将一组操作封装成一个执行单元,要么全部成功,要么全部失败 在Spring中使用事务有两种方式 一…

GitHub星标超70K,阿里大佬的架构总结“分布式全解”笔记霸榜

分布式架构与微服务平台是当今IT界的关键技术,也是资深软件工程师和系统架构师必须掌握的核心技术。 因此小编为各位粉丝朋友带来这份阿里大佬的分布式笔记:从传统分布式架构迁移到基于容器技术的微服务架构为主线,全面、透彻地介绍了与分布…

十七、Webpack搭建本地服务器

一、为什么要搭建本地服务器? 目前我们开发的代码,为了运行需要有两个操作: 操作一:npm run build,编译相关的代码;操作二:通过live server或者直接通过浏览器,打开index.html代码…

【业务功能篇106】 微服务-springcloud-springboot-电商订单模块--秒杀服务-定时任务【下篇】

四、秒杀活动 1.秒杀活动关注点 秒杀活动的最大特点就是高并发而且是短时间内的高并发,那么对我们的服务要求就非常高,针对这种情况所产生的共性问题,对应的解决方案: 2. 秒杀服务前端 当我们点击 秒杀抢购按钮后,对应…

【C#-1】C#调用matlab生成的dll库

matlab打包dll 1、matlab示例程序: function untitled4(x)z peaks(x);figuresurf(z) end 2、输入deploytool打包matlab程序,具体如下: 3、拷贝 打包成功后,将生成for_redistribution_files_only文件夹中的dll文件拷贝到C#程序…

【设计模式】三、概述分类+单例模式

文章目录 概述设计模式类型 单例模式饿汉式(静态常量)饿汉式(静态代码块)懒汉式(线程不安全)懒汉式(线程安全,同步方法)懒汉式(线程安全,同步代码块)双重检查静态内部类枚举单例模式在 JDK 应用的源码分析 …