python:多线程 简单示例

news2025/1/7 17:19:38

在Python中,多线程编程通常用于执行I/O密集型任务,因为Python的全局解释器锁(GIL)限制了多线程在CPU密集型任务上的性能提升。不过,对于需要同时处理多个I/O操作(如网络请求、文件读写等)的场景,多线程仍然非常有用。

Python的 threading 模块提供了创建和管理线程的基本工具。以下是一个简单的示例,展示了如何使用threading模块来创建和启动多个线程:

import threading
import time
 
# 线程执行的函数
def worker(thread_id, delay):
    print(f"线程 {thread_id} 开始工作,延迟 {delay} 秒")
    time.sleep(delay)
    print(f"线程 {thread_id} 完成工作")
 
# 创建线程列表
threads = []
 
# 启动多个线程
for i in range(5):
    thread = threading.Thread(target=worker, args=(i, 2))  # 创建一个线程对象
    threads.append(thread)
    thread.start()  # 启动线程
 
# 等待所有线程完成
for thread in threads:
    thread.join()
 
print("所有线程已完成")

在这个示例中,我们定义了一个简单的worker函数,该函数接受线程ID和延迟时间作为参数,模拟线程的工作。然后,我们创建了5个线程,每个线程都会调用worker函数,并传入不同的参数。最后,我们使用join()方法等待所有线程完成。

线程同步
多线程编程中,线程同步是一个重要问题。如果不加以控制,多个线程可能会同时访问共享资源,导致数据竞争和不一致。Python的threading模块提供了多种同步机制,如锁(Lock)、信号量(Semaphore)、条件变量(Condition)等。

以下是一个使用锁的示例:

import threading
 
# 共享资源
counter = 0
lock = threading.Lock()
 
# 线程执行的函数
def increment():
    global counter
    for _ in range(100000):
        lock.acquire()  # 获取锁
        counter += 1
        lock.release()  # 释放锁
 
# 创建线程列表
threads = []
 
# 启动多个线程
for _ in range(10):
    thread = threading.Thread(target=increment)
    threads.append(thread)
    thread.start()
 
# 等待所有线程完成
for thread in threads:
    thread.join()
 
print(f"最终计数器值: {counter}")

在这个示例中,我们使用了一个锁来保护对共享资源counter的访问。每个线程在修改counter之前都会先获取锁,修改完成后释放锁。这样可以确保同一时间只有一个线程能够访问counter,从而避免了数据竞争。

注意事项
全局解释器锁(GIL):Python的GIL限制了多线程在CPU密集型任务上的性能提升。对于这类任务,可以考虑使用multiprocessing模块来创建多个进程,每个进程都有自己的Python解释器和内存空间,从而绕过GIL的限制。
线程安全:确保线程访问共享资源时是线程安全的,可以使用锁、信号量等同步机制。
死锁:不当使用锁可能会导致死锁问题,即多个线程相互等待对方释放锁,从而永远无法继续执行。要避免死锁,需要确保每个线程都能按照相同的顺序获取锁。
性能开销:创建和销毁线程是有开销的,不要频繁创建和销毁线程。可以使用线程池(如concurrent.futures.ThreadPoolExecutor)来重用线程。
通过合理使用多线程编程,可以显著提高程序的并发性能和响应速度。然而,也需要注意多线程编程带来的复杂性和潜在问题。

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

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

相关文章

【工具整理】WIN换MAC机器使用工具整理

最近公司电脑升级,研发同学统一更换了 Mac Book Pro 笔记版电脑,整理一下安装了那些软件以及出处,分享记录下~ 知识库工具 1、语雀 网址:语雀,为每一个人提供优秀的文档和知识库工具 语雀 个人花园&…

【GUI-pyqt5】QWidget类

1. 描述 所有可视空间的基类是一个最简单的空白控件控件是用户界面的最小元素 接收各种事件(鼠标、键盘)绘制在桌面上,显示给用户看 每个控件都是矩形的,它们按z轴顺序排序控件由其父控件和前面的控件剪切没有父控件的控件&#…

SpringBoot Maven 项目 pom 中的 plugin 插件用法整理

把 SpringBoot Maven 项目打包成 jar 文件时,我们通常用到 spring-boot-maven-plugin 插件。 前面也介绍过,在 spring-boot-starter-parent POM 和 spring-boot-starter POM 中都有插件的管理,现在我们就撸一把构建元素中插件的用法。 一、…

springboot实战纪实-课程介绍

教程介绍 Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。 Spring Boot通过自动配置功能,降低了复杂性,同时支持…

源代码编译安装X11及相关库、vim,配置vim(2)

一、编译安装vim 编译时的cofigure选项如下.只有上一步的X11的包安装全了(具体哪些是必须的,哪些是多余的没验证),configure才能认为X的库文件和头文件是可以用的 ./configure --prefixpwd/mybuild \--x-includes/path/to/X11/m…

直接插入排序、折半插入排序、2路插入排序、希尔排序

本篇是排序专栏博客的第一篇,主要探讨以 “插入” 为核心思想的排序算法该如何实现 文章目录 一、前言二、直接插入排序1. 算法思想与操作分析2. 代码实现version 1version 2 3. 复杂度分析 三、折半插入排序1. 算法思想与操作分析2. 代码实现3. 复杂度分析 四、2路…

Ansible之批量管理服务器

文章目录 背景第一步、安装第二步、配置免密登录2.1 生成密钥2.2 分发公钥2.3 测试无密连接 背景 Ansible是Python强大的服务器批量管理 第一步、安装 首先要拉取epel数据源,执行以下命令 yum -y install epel-release安装完毕如下所示。 使用 yum 命令安装 an…

让 Agent 具备语音交互能力:技术突破与应用前景(16/30)

让 Agent 具备语音交互能力:技术突破与应用前景 一、引言 在当今数字化时代,人机交互方式正经历着深刻的变革。从早期的命令行界面到图形用户界面,再到如今日益普及的语音交互,人们对于与机器沟通的便捷性和自然性有了更高的追求…

学生作业完成情况管理程序

网上看到的一个课程设计,正好练练手。 首先设计数据库 数据库有三张表,分别是班级表,学生表,作业成绩表。 学生表中外键关联班级表,作业成绩表中外键关联学生表。具体如下图所示 班级表 学生表学生表外键关联 …

基于vue的商城小程序的毕业设计与实现(源码及报告)

环境搭建 ☞☞☞ ​​​Vue入手篇(一),防踩雷(全网最详细教程)_vue force-CSDN博客 目录 一、功能介绍 二、登录注册功能 三、首页 四、项目截图 五、源码获取 一、功能介绍 用户信息展示:页面顶部设有用户头像和昵称展示区,方便用户识别…

DeepSeek V3“报错家门”:我是ChatGPT

搜 :海讯无双Ai 要说这两天大模型圈的顶流话题,那绝对是非DeepSeek V3莫属了。 不过在网友们纷纷测试之际,有个bug也成了热议的焦点—— 只是少了一个问号,DeepSeek V3竟然称自己是ChatGPT。 甚至让它讲个笑话,生成…

利用webworker解决性能瓶颈案例

目录 js单线程的问题webworker的基本使用webworker的常见应用可视化优化导出Excel js单线程的问题 众所周知,js不擅长计算,计算是同步的,大规模的计算会让js主线程阻塞,导致界面完成卡死。比如有一个600多亿次的计算,…

深入理解卷积神经网络(CNN):图像识别的强大工具

1、引言 卷积神经网络(CNN)是一种深度学习模型,特别适合分析视觉数据。它们在处理图像和视频任务时表现尤为出色。由于CNN在物体识别方面的高效性,这种网络架构广泛应用于计算机视觉领域,例如图像分类、物体检测、面部…

R语言安装教程与常见问题

生物信息基础入门笔记 R语言安装教程与常见问题 今天和大家聊一个非常基础但是很重要的技术问题——如何在不同操作系统上安装R语言?作为生物信息学数据分析的神兵利器,R语言的安装可谓是入门第一步,学术打工人的必备技能。今天分享在Windows…

VOC数据集格式转YOLO格式

将VOC格式的数据集转换为YOLO格式通常涉及以下几个步骤。YOLO格式的标注文件是每个图像对应一个.txt文件&#xff0c;文件中每一行表示一个目标&#xff0c;格式为&#xff1a; <class_id> <x_center> <y_center> <width> <height>其中&#xf…

win10搭建zephyr开发环境

搭建环境基于 zephyr官方文档 基于官方文档一步一步走很快就可以搞定 一、安装chocolatey 打开官网 https://community.chocolatey.org/courses/installation/installing?methodinstall-from-powershell-v3 1、用管理员身份打开PowerShell &#xff08;1&#xff09;执行 …

物体切割效果

1、物体切割效果是什么 在游戏开发中&#xff0c;物体切割效果就是物体看似被切割、分割或隐藏一部分的视觉效果。 这种效果常用与游戏和动画中&#xff0c;比如角色攻击时的切割效果&#xff0c;场景中的墙壁切割效果等等。 2、物体切割效果的基本原理 在片元着色器中判断片…

k8s集群监控系统部署方案

1.方案介绍 本文介绍一种k8s集群监控系统,该系统可以监控k8s集群中的pod和node的性能指标,以及K8s资源对象的使用情况。 监控流程: 集群资源数据采集(cadvisor、node-exporter、kube-state-metrics)-- 数据收集、存储、处理等(prometheus)-- 数据可视化查询和展示(gra…

RP2K:一个面向细粒度图像的大规模零售商品数据集

这是一种用于细粒度图像分类的新的大规模零售产品数据集。与以往专注于相对较少产品的数据集不同&#xff0c;我们收集了2000多种不同零售产品的35万张图像&#xff0c;这些图像直接在真实的零售商店的货架上拍摄。我们的数据集旨在推进零售对象识别的研究&#xff0c;该研究具…

Linux(Centos 7.6)命令详解:ls

1.命令作用 列出目录内容(list directory contents) 2.命令语法 Usage: ls [OPTION]... [FILE]... 3.参数详解 OPTION: -l&#xff0c;long list 使用长列表格式-a&#xff0c;all 不忽略.开头的条目&#xff08;打印所有条目&#xff0c;包括.开头的隐藏条目&#xff09…