当前位置: 首页 > article >正文

《python》—— threading库(线程和多线程)

文章目录

    • threading简介
    • threading基本概念
    • 常用类和方法
    • 线程同步
    • 线程池
    • 实例

threading简介

threading 是 Python 标准库中用于实现多线程编程的模块。多线程编程允许程序同时执行多个任务,提高程序的并发性能,尤其适用于 I/O 密集型任务,例如网络请求、文件读写等。、

threading基本概念

  • 线程(Thread):是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
  • 多线程(Multithreading):指的是在一个程序中同时运行多个线程,每个线程可以独立执行不同的任务。

常用类和方法

  • Thread 类
    • Thread 类是 threading 模块中最核心的类,用于创建和管理线程。
      • 创建线程的方式:
        • 方式一:直接实例化 Thread 类

          import threading# 定义一个函数作为线程要执行的任务
          def print_numbers():for i in range(5):print(f"Number: {i}")# 创建线程对象
          thread = threading.Thread(target=print_numbers)# 启动线程
          thread.start()# 等待线程执行完毕
          thread.join()print("Main thread finished.")
          
        • 结果:
          在这里插入图片描述

        • 方式二:继承 Thread 类

          import threading# 自定义线程类,继承自 threading.Thread
          class MyThread(threading.Thread):def run(self):for i in range(5):print(f"Number: {i}")# 创建线程对象
          thread = MyThread()# 启动线程
          thread.start()# 等待线程执行完毕
          thread.join()print("Main thread finished.")
          
        • 结果:
          在这里插入图片描述

      • 其他常用方法和属性
        • getName() 和 setName():用于获取和设置线程的名称。

          import threadingdef print_hello():print(f"Hello from {threading.current_thread().getName()}")thread = threading.Thread(target=print_hello)
          thread.setName("MyThread")
          thread.start()
          thread.join()
          
        • is_alive():用于判断线程是否还在运行。

          import threading
          import timedef long_task():time.sleep(2)thread = threading.Thread(target=long_task)
          thread.start()
          print(f"Thread is alive: {thread.is_alive()}")
          thread.join()
          print(f"Thread is alive: {thread.is_alive()}")
          

          在这里插入图片描述

线程同步

在多线程编程中,多个线程可能会同时访问和修改共享资源,这可能会导致数据不一致的问题。为了解决这个问题,threading 模块提供了一些同步机制。

  • Lock 类
    • Lock 是一种最基本的同步原语,用于确保同一时间只有一个线程可以访问共享资源。

      import threading# 创建一个锁对象
      lock = threading.Lock()
      shared_variable = 0def increment():global shared_variablefor _ in range(100000):# 获取锁lock.acquire()try:shared_variable += 1finally:# 释放锁lock.release()threads = []
      for _ in range(2):thread = threading.Thread(target=increment)threads.append(thread)thread.start()for thread in threads:thread.join()print(f"Shared variable: {shared_variable}")
      

      在这里插入图片描述

  • RLock 类
    • RLock 是可重入锁,允许同一个线程多次获取锁而不会导致死锁。
      import threading# 创建一个可重入锁对象
      rlock = threading.RLock()def recursive_function():rlock.acquire()try:print("Lock acquired")recursive_function()finally:rlock.release()thread = threading.Thread(target=recursive_function)
      thread.start()
      thread.join()
      

线程池

虽然 threading 模块本身没有直接提供线程池的功能,但可以使用 concurrent.futures 模块中的 ThreadPoolExecutor 来实现线程池。

import concurrent.futuresdef square(x):return x * xwith concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:results = executor.map(square, [1, 2, 3, 4, 5])for result in results:print(result)

在这里插入图片描述
在上述代码中,ThreadPoolExecutor 用于创建一个线程池,max_workers 参数指定了线程池中的最大线程数。executor.map() 方法用于并行执行任务

实例

实例代码展示了 Python 中 threading 模块的基本使用,包括创建线程、启动线程以及向线程函数传递参数等操作。

import threadingdef worker():print('线程开始执行')for i in range(5):print(f'线程正在工作:{i}')print('线程执行完毕')
thread = threading.Thread(target=worker)
thread.start()
print('***主线程继续执行***')'''传递参数'''
def worker(name):print(f'{name}线程开始执行')for i in range(5):print(f'{name}正在工作:{i}')print(f'{name}线程执行完毕')thread = threading.Thread(target=worker,args=('线程1',))
thread.start()
print('***主线程继续执行***')import threading
import timedef run(n):print('task', n)time.sleep(1)print('2s')time.sleep(1)print('1s')time.sleep(1)def run2(t):time.sleep(t)print(f'我等了{t}秒')if __name__ == '__main__':t1 = threading.Thread(target=run, args=('t1',))t2 = threading.Thread(target=run, args=('t2',))# 启动 t1 和 t2 线程t1.start()t2.start()# 修正参数,传递整数秒数t3 = threading.Thread(target=run2, args=(5,))t4 = threading.Thread(target=run2, args=(8,))# 启动 t3 线程t3.start()# 启动 t4 线程t4.start()# 主线程等待 10 秒time.sleep(10)print('开始倒计时')

结果:
在这里插入图片描述

相关文章:

《python》—— threading库(线程和多线程)

文章目录 threading简介threading基本概念常用类和方法线程同步线程池实例 threading简介 threading 是 Python 标准库中用于实现多线程编程的模块。多线程编程允许程序同时执行多个任务,提高程序的并发性能,尤其适用于 I/O 密集型任务,例如…...

【数据分享】2000-2024年全国逐年归一化植被指数(NDVI)栅格数据(年最大值)

NDVI,全名为Normalized Difference Vegetation Index,中文名称为归一化植被指数。这个指数可以用来定性和定量评价植被覆盖及其生长活力,我们也可以简单地将它理解为体现植被密度和健康状况的一个指标。 之前我们给大家分享了来源于MOD13A3数…...

【项目】负载均衡式在线OJ

负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍: 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…...

前端发布缓存导致白屏解决方案

解决发布H5后因为本地缓存白屏方案 一、 核心配置优化(前提是访问网站的请求能抵达服务器) 方案一:前端项目设置全局不缓存方案 运行逻辑:在H5服务器配置中增加Cache-Control: no-cache或max-age0响应头,禁用静态资…...

大模型开源的工具包有哪些特殊符号可以使用;SEP 是什么

大模型开源的工具包有哪些特殊符号可以使用 目录 大模型开源的工具包有哪些特殊符号可以使用自定义特殊token:special_tokens=True一、**对话轮次分隔符(必选)**二、**系统提示标记(提升指令理解)**三、**中文特色分隔符(贴合书写习惯)**四、**开源模型专属符号(按文档…...

混沌理论与混沌映射——算法改进初始化创新点之一

混沌理论与混沌映射 混沌理论研究混沌系统的动力学,其特征是非线性和对初始条件的极端敏感性。即使在这些条件下的微小变化也可能导致系统结果的显著变化。尽管看起来是随机的,混沌系统可以在不依赖随机性的情况下表现出不规则的行为,因为确…...

19874并查集

19874并查集 ⭐️难度:中等 🌟考点:并查集、数据结构 📖 📚 import java.util.*;public class Main {static int N 100010;static int[] a new int[N];static int[] p new int[N];static int n;static int m;st…...

macOS 安装配置 iTerm2 记录

都说 macOS 里替换终端最好的就是 iTerm2 ,这玩意儿还是开源的,所以就也根风学习一下,但全是英文的挺麻烦,所以这里记录一下自己的设置,以最简单的安装及设置为主,想要更酷炫、更好看的还请自己百度吧&…...

LLM最新的模型微调技术有哪些

LLM 最新的模型微调技术有哪些 目录 LLM 最新的模型微调技术有哪些1. QLoRA(Quantized Low-Rank Adaptation)2. P-Tuning v23. LoRA++(增强版 LoRA)4. AdaLoRA(Adaptive LoRA)5. BitFit(仅微调偏置)1. QLoRA(Quantized Low-Rank Adaptation) 原理:QLoRA 结合了低秩自…...

Jmeter下载安装配置及使用

1、下载 官网地址:Apache JMeter - Download Apache JMeter 2、配置环境变量 ①找到环境变量,两种方法 法一:我的电脑→右键菜单→属性→高级系统设置→环境变量 法二:直接搜索环境变量 ②新建两个系统变量 1.变量名&#x…...

简单易懂Modbus Tcp和Rtu的异同点

关键说明 无需修改业务逻辑:同一套读写代码可同时支持TCP和RTU,仅需调整底层通信接口。 工具兼容性:调试工具(如Modbus Poll)可同时解析两种协议,仅需切换传输模式。 系统集成优势:混合网络下可…...

try catch的使用

try catch的使用 在 Java 中,try-catch 语句用于异常处理。异常处理可以帮助我们在程序出现错误时,不会导致程序崩溃,而是采取一定的措施来处理错误。try-catch 语句是用于捕获并处理异常的机制。 基本语法 try {// 可能会抛出异常的代码块…...

【从零开始学习计算机科学】编译原理(一)编译过程概述

【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…...

PCL 点云AABB包围盒(二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 包围盒是一种求解离散点集最优包围空间的算法,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。(来源于百度)常用的求解包围盒的算法主要有AABB和OOB算法,其中AABB的算法思想…...

【算法day8】 Z 字形变换 -O(n)算法思路整理

Z 字形变换,算法思路整理 https://leetcode.cn/problems/zigzag-conversion/description/ 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下…...

L3-1 夺宝大赛

输入样例 1: 5 7 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 2 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 7 1 5 7 1 1 1 5 5 3 1 3 5 1 4输出样例 1: 7 6样例 1 说明: 七支队伍到达大本营的时间顺次为:7、不可能、5、3、3、5、6&#xff0c…...

Matlab:矩阵运算篇——矩阵

目录 1.定义 实例——创建矩阵 实例——创建复数矩阵 2.矩阵的生成 实例——M文件矩阵 2.利用文本创建 实例——创建生活用品矩阵 3.创建特殊矩阵 实例——生成特殊矩阵 4.矩阵元素的运算 1.矩阵元素的修改 实例——新矩阵的生成 2.矩阵的变维 实例——矩阵维度修…...

泛微ecode的页面开发发送请求参数携带集合

1.在开发过程中我们难免遇见会存在需要将集合传递到后端的情况,那么这里就有一些如下的注意事项,如以下代码: // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…...

【结构光相机的精度极限】

1. 光源波长((\lambda)) 光源波长是决定结构光相机精度极限的核心因素之一。根据光学衍射极限理论,光的波长越短,能够分辨的细节越小,精度越高。 理论依据: 根据瑞利判据(Rayleigh Criterion&…...

Javaweb后端全局异常处理器

类名随便定义 这是异常处理的方法exceptionhandler responsebody作用,方法的响应值返回给前端,如果返回的是集合对象,会把集合对象转为json,再给前端响应返回...

SpringBoot缓存抽象:@Cacheable与缓存管理器配置

文章目录 引言一、SpringBoot缓存抽象概述二、Cacheable注解详解2.1 Cacheable的关键属性 三、缓存管理器配置四、自定义键生成策略五、缓存同步与失效策略六、SpringBoot缓存最佳实践总结 引言 缓存是提升应用性能的关键技术,SpringBoot提供了强大的缓存抽象层&am…...

下载文件,文件名乱码问题

C# .net framework 4.8 mvc 项目,做一个文件下载功能。 原项目是前端使用razor引擎方式做页面渲染的。 该项目原来就有一个模块是可供文件下载的,且文件名是中文。 但是我现在新增的这个模块,领导要求用js写,觉得razor太笨重。 …...

深入理解Linux进程管理:从基础到高级操作指南

1. 进程的定义、组成和环境 什么是进程? 想象你的电脑是一个大工厂,进程就是工厂里正在运行的机器。每个机器(进程)都有自己的任务,比如一台机器负责打印文件,另一台负责播放音乐。 进程的组成&#xff1…...

DOM与CSS:网页设计的核心力量

DOM与CSS:网页设计的核心力量 引言 在网页设计中,DOM(文档对象模型)与CSS(层叠样式表)是两个不可或缺的组成部分。它们共同构成了现代网页的骨架与外衣。本文将深入探讨DOM与CSS的关系、作用以及如何有效地运用它们来提升网页设计质量。 DOM:网页内容的结构化表示 什…...

深入解析pnpm与npm:颠覆传统包管理的技术革命与应用实践

深入解析pnpm与npm:颠覆传统包管理的技术革命与应用实践 引言:被node_modules支配的恐惧 "你的node_modules有多大?"这个灵魂拷问总能引发开发者会心一笑。当项目规模达到500MB时,npm install需要喝三杯咖啡的时间&am…...

OpenSSL 的主要功能及其示例命令

OpenSSL 是一个功能强大的开源工具包,用于处理各种与加密相关的任务,包括生成密钥、创建证书、加密解密数据、验证证书等。以下是 OpenSSL 的主要功能及其示例命令。 1.生成密钥 1.1 生成 RSA 私钥 openssl genrsa -out private_key.pem 2048• 说明&a…...

江科大51单片机笔记【11】AT24C02(I2C总线)

一、存储器 1.介绍 RAM的特点是存储速度特别快,但是掉电会丢失;ROM的特点是存储速度特别慢,但是掉电不会丢失 SRAM是所有存储器最快的,一般用于电脑的CPU高速缓存,容量相对较少,成本较高;DRAM…...

html css 笔记

01_浏览器相关知识 五大主流浏览器: Chrome Safari IE Firefox Opera (拥有自己的内核) 四大内核: webkit Trident Gecko blink. 02_网页相关知识 构成 网址 网站 网页 网页标准: 结构 表现 行为 分别对应 HTML CSS JavaScript 03_HTML简介 H…...

【一句话经验】ubuntu vi/vim 模式自动设置为paste

从centos过来,发现ubutun有些地方不习惯,尤其是vi的粘贴,默认自动进去了代码模式,导致每次粘贴必须得set paste,否则会出现问题。 解决办法非常简单,按照下面命令执行即可: cd ~ echo "…...

外层元素旋转,其包括在内的子元素一并旋转(不改变旋转中心),单元测试

思路&#xff1a;外层旋转后坐标&#xff0c;元素旋转后坐标&#xff0c;计算偏移坐标 <template><div class"outbox"><label>角度: <input v-model.number"rotate" type"number" /></label><br><div c…...