Python笔记之线程库threading
Python笔记之线程库threading

参考博文
Python多线程笔记——简单函数版和类实现版
code review!
Python 的 threading 库用于在程序中创建和管理线程。线程允许程序并发执行多个任务。以下是 threading 库的详解和一些简洁示例。
基本概念
- 线程:在一个进程中,一个线程是执行指令的单独路径。
- 主线程:每个程序启动时都会有一个默认的主线程。
- GIL(全局解释器锁):Python 的线程受到 GIL 的限制,不能真正并行地运行 CPU 绑定的任务,但在 I/O 密集型任务中仍然可以提高性能。
重要类和方法
Thread类:用于创建线程。start(): 开始线程活动。join(): 阻塞调用线程,直到被调用的线程终止。run(): 线程活动的方法。
Lock类:用于线程间同步,防止竞争条件。RLock类:可重入锁,允许在同一线程中多次获得锁。Condition类:用于线程间通信。Semaphore类:控制对共享资源的访问。Event类:用于线程间信号通信。
简单示例
1. 创建并启动线程
import threadingdef print_numbers():for i in range(5):print(i)# 创建线程
thread = threading.Thread(target=print_numbers)# 启动线程
thread.start()# 等待线程完成
thread.join()print("Thread has finished execution.")
2. 使用锁同步线程
import threadingcounter = 0
lock = threading.Lock()def increment_counter():global counterwith lock:for _ in range(10000):counter += 1threads = [threading.Thread(target=increment_counter) for _ in range(2)]for thread in threads:thread.start()for thread in threads:thread.join()print(f"Final counter value: {counter}")
3. 创建自定义线程类
import threadingclass MyThread(threading.Thread):def run(self):for i in range(5):print(f"Thread {self.name}: {i}")# 实例化并启动自定义线程
thread = MyThread()
thread.start()
thread.join()
注意事项
- 线程安全:在访问共享数据时使用锁确保线程安全。
- 性能:对于 CPU 密集型任务,考虑使用
multiprocessing模块。 - 调试:调试多线程程序可能会比较困难,可以使用日志记录来帮助调试。
这些示例展示了如何使用 threading 库创建和管理线程,以及如何解决常见的同步问题。
相关文章:
Python笔记之线程库threading
Python笔记之线程库threading 参考博文 Python多线程笔记——简单函数版和类实现版 code review! Python 的 threading 库用于在程序中创建和管理线程。线程允许程序并发执行多个任务。以下是 threading 库的详解和一些简洁示例。 基本概念 线程:在一个进程中&a…...
go 包管理
Go语言所依赖的所有的第三方库都放在GOPATH目录下面 gomodule是Go语言默认的依赖管理工具 Modules是相关Go包的集合,是源代码交换和版本控制的单元,用于指定使用哪些源文件 GO111MODULEoff禁用gomodule,编译时从GOPATH和vendor文件夹中查找包…...
Js内建对象
数组解构 const arr ["1","2","3"]let a,b,c// 解构赋值 //将数组的第一个元素赋值给第一个变量,第二个元素赋值给第二个变量,依次类推[a,b,c] arr console.log(a,b,c) // 1 2 3 // 声明变量同时解构 let [a,b,c] [&qu…...
AXI接口的实现逻辑和底层原理,在FPGA中如何实现AXI接口,一篇文章足以搞明白!!!
AXI(Advanced eXtensible Interface)接口是一个点对点的接口,用于连接高性能的片上系统(SoC)中的处理器、外围设备、内存和其他IP核。以下是对AXI接口的详细解析,包括FPGA实现的原理、逻辑、速度以及详细的…...
《GBDT 算法的原理推导》 11-12计算损失函数的负梯度 公式解析
本文是将文章《GBDT 算法的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。 公式(11-12)是GBDT算法中非常关键的一步,它表示了如何通过计算损失函数的负梯度来指导下一棵树的生长。 公式(11-12)如下: r m i − [ ∂ …...
mysql设计
大家好,我是捡田螺的小男孩。 昨天一位粉丝,咨询了一个并发的问题~ 我提供了一个乐观锁兜底的方案,然后发现他们的表,都没有加version字段的,我想到,这不是表设计通用字段嘛。因此,本文跟大家聊聊…...
Android 斗鱼面经
Android 斗鱼面经 文章目录 Android 斗鱼面经一面二面 一面 先简单描述一下JVM JRE JDK的关系 :::info JVM(Java Virtual Machine) Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作…...
【机器学习】26. 聚类评估方法
聚类评估方法 1. Unsupervised Measure1.1. Method 1: measure cohesion and separationSilhouette coefficient Method 2:Correlation between two similarity matricesMethod 3:Visual Inspection of similarity matrix 2. Supervised measures3. 决定…...
linux 最多能创建多少个 TCP 连接?
linux 最大允许TCP连接数 约束一:服务器的端口范围约束二,服务器文件描述符限制约束三:系统线程约束四:系统内存总结 tcp连接四元组:源ip,源端口 <> 目标ip,目标端口 连续对同一个目标ip及…...
我为何要用wordpress搭建一个自己的独立博客
我在csdn有一个博客,这个博客是之前学习编程时建立的。 博客有哪些好处呢? 1,可以写自己的遇到的问题和如何解决的步骤 2,心得体会,经验,和踩坑 3,可以转载别人的好的技术知识 4,宝贵…...
Linux系统每日定时备份mysql数据
一、创建存储脚本的文件夹 创建文件夹,我的脚本放在/root/dbback/mysql mkdir ... cd /root/dbback/mysql 二、编写脚本 vi backup_mysql.sh 复制脚本内容 DB_USER"填写用户名" DB_PASSWORD"填写密码" DB_NAME"数据库名称" # …...
书生大模型第一关Linux基础知识
任务一:完成SSH连接与端口映射并运行hello_world.py 1.SSH及其端口映射 2.在VSCode中安装插件: 3.创建开发机 最后点击创建,然后可能需要等待一段较长的时间,大概需要5分钟左右,如果需要排队则更长时间 然后选择…...
机器学习之fetch_olivetti_faces人脸识别--基于Python实现
fetch_olivetti_faces 数据集下载 fetch_olivetti_faceshttps://github.com/jikechao/olivettifaces sklearn.datasets.fetch_olivetti_faces(*, data_homeNone, shuffleFalse, random_state0, download_if_missingTrue, return_X_yFalse, n_retries3, delay1.0)[source] L…...
【系统设计】深入理解HTTP缓存机制:从Read-Through缓存到HTTP缓存的交互流程
在现代Web开发中,缓存机制扮演着至关重要的角色。它不仅提升了用户体验,还极大地优化了资源的使用效率。在这篇博文中,我们将从“Read-Through”缓存的概念出发,深入探讨HTTP缓存的工作原理和交互流程,并详细描述max-a…...
FLINK单机版安装部署入门-1
文章目录 FLINK单机版安装部署高于1.9.3需要修改配置文件flink-conf.yaml(低于1.9.3可以跳过)linux启动集群windows下启动Flink实例运行(单机)还有一种方式是上传任务包运行examples\streamingjava: Compilation failed: internal java compiler error高版本启动脚本 FLINK单机…...
深度学习-学习率调整策略
在深度学习中,学习率调整策略(Learning Rate Scheduling)用于在训练过程中动态调整学习率,以实现更快的收敛和更好的模型性能。选择合适的学习率策略可以避免模型陷入局部最优、震荡不稳定等问题。下面介绍一些常见的学习率调整策…...
【学员提问bug】小程序在onUnload里面调接口,用来记录退出的时间, 但是接口调用还没成功, 页面就关闭了。如何让接口在onUnload关闭前调用成功?
这种问题比较通用,并不涉及到具体方法执行障碍,所以,解决起来也不麻烦。但是新手往往不知道如何做。 在小程序中,如果在 onUnload 中调用 API 记录页面退出时间,但因为页面关闭速度较快导致请求未完成,可以…...
【刷题13】链表专题
目录 一、两数相加二、两两交换链表的节点三、重排链表四、合并k个升序链表五、k个一组翻转链表 一、两数相加 题目: 思路: 注意整数是逆序存储的,结果要按照题目的要求用链表连接起来遍历l1的cur1,遍历l2的cur2,和…...
Python Turtle模块详解与使用教程
Python Turtle模块详解与使用教程 引言 Python是一种广泛使用的编程语言,其简洁易读的语法使得它成为初学者学习编程的理想选择。而Turtle模块则是Python标准库中一个非常有趣且实用的图形绘制工具,特别适合用于教育和学习编程的基础知识。通过Turtle模…...
【PTA】4-2 树的同构【数据结构】
给定两棵树 T1 和 T2。如果 T1 可以通过若干次左右孩子互换就变成 T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。 图一…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
