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

python异步编程(1)——理论篇

1.理解多线程

当启动一个Python程序时,它会作为一个单独的进程运行在操作系统中。进程是操作系统分配资源(如内存和处理器时间)的基本单位。每个Python程序启动时,都会创建一个主线程。如果没有在代码中明确创建其他线程,那么程序中的所有操作都会在这个主线程中同步执行。

在单线程应用中,代码的执行是顺序和同步的。这意味着在任何给定时间点,程序中只有一部分代码在执行,直到它完成后,程序才会继续执行下一部分代码。

所以,如果需要同时执行多个任务,就可以通过创建额外的线程来实现。线程是进程内的执行单元,它们共享相同的内存空间,但可以并行执行不同的任务。在Python中,多线程通常用于I/O密集型任务,如文件操作、网络请求等。不过要注意的是,由于Python的全局解释器锁(GIL),在CPU密集型任务中使用多线程可能不会带来性能上的提升。在这种情况下,可以考虑使用多进程。

2.i/o密集 cpu密集和python多线程多进程

先明确它们是什么,有什么区别:

 I/O密集型(输入/输出密集型)任务是指那些主要时间花在I/O操作上的任务,如读写文件、网络通信、数据库操作等。在这类任务中,CPU的使用率通常不高,因为CPU大部分时间都在等待I/O操作的完成。

CPU密集型任务是指那些主要时间花在CPU计算上的任务,例如复杂的数学运算、图像处理等。这些任务需要大量的CPU时间来进行计算。

为什么CPU密集型的任务更适合多进程?为什么I/O密集型的任务更适合多线程?

答:

Python中有一个名为全局解释器锁(GIL)的机制,它阻止了多个线程同时执行Python字节码。因此,在多线程环境下,即使有多个CPU核心,也无法同时运行多个线程进行计算密集型任务。也就是说在CPU密集型任务的情况下,python的多线程是假的多线程。多进程可以在多核处理器上并行运行,每个进程运行在不同的CPU核上,从而实现真正的并行计算,避开了GIL的限制。

线程间共享内存和资源,切换线程的代价比切换进程低,这对于频繁的I/O操作来说非常有效率。当一个线程在等待I/O操作完成时,其他线程可以继续执行,从而更好地利用CPU。也就是说CPU是没有被用得很多(大部分情况下都是在等待),这也就不难解释python的多线程在I/O密集型任务的情况下,python的多线程是真的多线程。

3.并发和并行

并发是指多个任务在同一时间段内进行,但并不意味着它们在同一时刻执行。在单核处理器上,实际上并没有多个任务真正同时执行,而是通过任务间快速切换给人一种“同时运行”的错觉。这种情况适用于任务数多于CPU核心数的情况。

并行是指多个任务在同一时刻真正同时执行。这通常发生在多核处理器上,其中每个核心可以同时处理一个不同的任务。这种情况适用于当核心数多于或等于进程数时。

我们从多进程的角度来说明:电脑中如果你打开资源管理器,就能看到有几十个进程在运行,但是大多数电脑的核心都不会很多,所以多进程的本质是操作系统让得不同进程在核心上切换运行,在进程不活跃或者不需要进行计算的时候就切换出去来实现多进程

4.协程是什么?

协程(Coroutine)是一种计算机程序组件,它广泛用于实现异步编程。协程提供了一种比传统线程更轻量级的并发模型。

轻量级:协程比线程更轻量。它们不是由操作系统直接管理,而是在用户空间内进行调度,从而减少了上下文切换的开销。也就意味着创建和销毁协程的代价远低于线程。协程是在单个线程内调度的,因此不涉及线程切换的开销,也不会有多线程相关的锁竞争问题。

协程相比线程的优点:线程的创建需要占用大量的内存,也就是说当有成千上万的网络请求需要发送的时候,需要的线程数是相当大的,占用的内存也是相当大的;同时线程可能需要处理线程同步问题,如数据竞争和死锁,但是协程就不需要,它提供了更简洁的异步编程模型,尤其是在支持 async/await 语法的语言中(如python):

import asyncio
import aiohttp  # 需要安装 aiohttp 包async def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():# 创建一个 aiohttp 的会话async with aiohttp.ClientSession() as session:urls = ["http://example.com", "http://example.org", "http://example.net"]tasks = []# 为每个 URL 创建一个任务for url in urls:task = asyncio.create_task(fetch(session, url))tasks.append(task)# 等待所有任务完成responses = await asyncio.gather(*tasks)# 输出结果for response in responses:print(response)# 运行主协程
asyncio.run(main())

fetch 是一个异步函数,它使用 aiohttp 库异步地获取给定 URL 的内容。

main 是另一个异步函数,它首先创建一个 aiohttp.ClientSession,然后为每个 URL 创建一个 fetch 协程的任务。

使用 asyncio.gather 同时运行所有的 fetch 任务,并等待它们全部完成。

最后,使用 asyncio.run(main()) 来运行 main 协程。

协程相比于线程的缺点:协程可能使得错误处理和调试变得更加复杂。协程的异步性质意味着堆栈跟踪可能不如同步代码那样直观,而且错误可能在程序的不同部分之间传播,使得定位问题变得更加困难。处理能力显然不如线程强大。

相关文章:

python异步编程(1)——理论篇

1.理解多线程 当启动一个Python程序时,它会作为一个单独的进程运行在操作系统中。进程是操作系统分配资源(如内存和处理器时间)的基本单位。每个Python程序启动时,都会创建一个主线程。如果没有在代码中明确创建其他线程&#xf…...

PyTorch复现网络模型VGG

VGG 原论文地址:https://arxiv.org/abs/1409.1556VGG是Visual Geometry Group(视觉几何组)的缩写,它是一个在计算机视觉领域中非常有影响力的研究团队,主要隶属于牛津大学的工程系和科学系。VGG以其对卷积神经网络&am…...

Springboot集成Javamelody

JavaMelody的目标是监视QA和生产环境中的Java或Java EE应用服务器。它不是模拟用户请求的工具,而是根据用户对应用程序的使用情况来衡量和计算应用程序实际操作的统计信息的工具。JavaMelody主要基于请求统计和演化图。 它允许改进QA和生产中的应用程序&#xff0c…...

如何将 h5 页面快速转换成微信小程序

Hello各位朋友们大家新的一月好呀!我是咕噜铁蛋!我知道在小程序开发中,有时候需要将H5页面转换成微信小程序页面。这样可以将原本的网页内容适配到小程序中,让用户能够更方便地访问和使用。在本文中,我将分享如何快速将…...

在Vue的模块开发中使用GPT的体验及总结

我这一周都在忙着实现一个页面,这个页面是通过vue基于element-ui来实现的。在这个过程中,我把页面拆分成多个组件,而组件的生成是通过Chat-GPT3来实现的。 这又是一次使用AI来协同开发的体验,觉得有必要总结一下: 遵循…...

Java常见算法题解析面试题(中)

11.判断101-200之间有多少个素数,并输出所有素数。【重点】 程序分析:判断素数的方法,用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 public class lianxi { publi…...

提升网站性能的秘诀:为什么Nginx是高效服务器的代名词?

在这个信息爆炸的时代,每当你在浏览器中输入一个网址,背后都有一个强大的服务器在默默地工作。而在这些服务器中,有一个名字你可能听说过无数次——Nginx。今天,就让我们一起探索这个神奇的工具。 一、Nginx是什么 Nginx&#x…...

[Python图像处理] 使用OpenCV创建深度图

使用OpenCV创建深度图 双目视觉创建深度图相关链接双目视觉 在传统的立体视觉中,两个摄像机彼此水平移动,用于获得场景上的两个不同视图(作为立体图像),就像人类的双目视觉系统: 通过比较这两个图像,可以以视差的形式获得相对深度信息,该视差编码对应图像点的水平坐标的…...

vue+element 换肤功能

1.首先建深色和浅色两个主题样式变量样式表,样式表名和按钮中传入的值一样,本例中起名为default.scss和dark.scss 2.在data中定义主题变量名 zTheme:‘defalut’,默认引用defalut.scss, 在点击按钮时切换引用的样式表,达到换肤效果…...

python魔法函数[全面]

1、init 用于初始化对象的属性和状态 当创建一个对象时,Python会自动调用该对象的__init__方法。 这个方法用于初始化对象的属性和状态,是对象创建过程中的一个重要环节 2、new # 通常我们不需要重写__new__方法,除非我们正在进行一些非常…...

python实现贪吃蛇小游戏(附源码)

文章目录 导入所需的模块坐标主游戏循环模块得分 贪吃蛇小游戏,那个曾经陪伴着00后和90后度过无数欢笑时光的熟悉身影,仿佛是一把打开时光之门的钥匙。它不仅是游戏世界的经典之一,更是我们童年岁月中不可或缺的一部分,一个承载回…...

爬虫学习笔记-Cookie登录古诗文网

1.导包请求 import requests 2.获取古诗文网登录接口 url https://so.gushiwen.cn/user/login.aspxfromhttp%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx # 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …...

Linux网络状态查看与防火墙管理

网络状态查看 netstat [选项] Netstat是一款命令行工具,用于显示Linux系统中网络的状态信息,可以显示网络连接、路由表、连接的数据统计等信息。 使用 选项 -a:显示所有选项,包括监听和未监听的端口。 -t:仅显示tc…...

VxTerm:C++ MFC,在工具栏中增加Edit/ComboBox等组件,打造一个地址栏/搜索栏功能

VxTerm软件可以在本站链接下载:唯一国产化SSH工具下载,单文件纯绿色不需要安装,替代SecureCRT 在软件的主界面中,增加了一个地址栏功能。 本人的文章内容都是经本人亲自实现并验证成功的干货,关注我,互相交…...

【Android】屏幕锁

屏幕锁,就是锁住屏幕不让用户误触摸,从开发者的角度看就是不响应用户的点击事件。 屏幕锁界面 可以自己创建一个布局文件,或者直接创建一个View(例如ImageView)。 参数LayoutParams mLayoutParams new LayoutParam…...

springCloud gateway 防止XSS漏洞

springCloud gateway 防止XSS漏洞 一.XSS(跨站脚本)漏洞详解1.XSS的原理和分类2.XSS漏洞的危害3.XSS的防御 二.Java开发中防范XSS跨站脚本攻击的思路三.相关代码(适用于spring cloud gateway)1.CacheBodyGlobalFilter.java2.XssRequestGlobalFilter.java…...

美赛摘要写作重点

摘要是论文最重要的部分。竞赛要求每篇论文的首页为摘要页,如果摘要写得不好,即使有好的模型和解答,论文也将难以通过鉴别阶段的初审而进入下一阶段。 根据MCM的竞赛规则,摘要应该包含以下内容: 赛题重述与阐明&#…...

RUST笔记: 动态链接库的创建和使用

生成动态链接库 // https://github.com/vvvm23/funny-shapes # 项目元信息 [package] name "funnyshapes" # 项目名称 version "0.1.0" # 版本号 edition "2021" # Rust语言版本# 更多配置信息可查阅&#xff1…...

「阿里云」幻兽帕鲁个人服务器已上线,3分钟快速搭建

基于阿里云搭建幻兽帕鲁服务器方法,1到2分钟部署完成,稳定运行无卡顿,阿里云服务器网aliyunfuwuqi.com分享保姆级手把手教程,基于阿里云计算巢、云服务器或无影云桌面都可以: 基于阿里云幻兽帕鲁服务器创建教程 基于…...

@ 代码随想录算法训练营第6周(C语言)|Day36(贪心)

代码随想录算法训练营第6周(C语言)|Day36(贪心) Day36、贪心(包含题目 ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间 ) 435. 无重叠区间 题目描述 给定一个区间的集合,找到需要…...

2026AIGC 短剧出海全链路落地服务测评

2026 年 AIGC 短剧出海行业已迈入精细化商业落地阶段,专业全链路服务商与AI 视频生成平台的赛道分化成为行业发展的核心特征,二者依托差异化的服务模式、能力体系与价值输出,精准覆盖不同出海主体的需求场景。集之互动作为深耕短剧出海领域的…...

直播技术:B站第三方推流方案的实现与应用探索

直播技术:B站第三方推流方案的实现与应用探索 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码,以便可以绕开哔哩哔哩直播姬,直接在如OBS等软件中进行直播,软件同时提供定义直播分区和标题功能 项…...

AdGuard浏览器扩展全方位部署与优化指南:打造无广告浏览环境

AdGuard浏览器扩展全方位部署与优化指南:打造无广告浏览环境 【免费下载链接】AdguardBrowserExtension AdGuard browser extension 项目地址: https://gitcode.com/gh_mirrors/ad/AdguardBrowserExtension 广告拦截与隐私保护的终极解决方案 网络浏览时不断…...

Keil中内存概念:Flash、SRAM、RO、RW、ZI、.data、.bss、heap、stack、MAP文件

此文章转载于微信公众号:嵌入式电子学习,只作为笔记备忘录使用 内存属性 理解Keil MDK(或ARM编译器)中关于程序内存布局的一些基本概念(RO、RW、ZI和.data、.bss、heap、stack、Flash、SRAM)。这些概念对…...

OpenCV需要的Numpy知识

图像 NumPy 数组彩色图:(高度, 宽度, 3)灰度图:(高度, 宽度)像素值:0~255,类型 uint8下面所有内容,都围绕这句话。1. 创建数组1.1 np.array () —— 把列表变成数组import numpy as np ​ a np.array([1, 2, 3]) b …...

GetQzonehistory完整指南:3分钟学会备份QQ空间所有说说

GetQzonehistory完整指南:3分钟学会备份QQ空间所有说说 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 想要永久保存QQ空间里的青春回忆吗?GetQzonehistory是一款…...

轻量级大模型新选择:Gemma-3-270m在边缘设备部署的完整步骤详解

轻量级大模型新选择:Gemma-3-270m在边缘设备部署的完整步骤详解 1. 为什么选择Gemma-3-270m作为边缘设备首选 如果你正在寻找一个既轻量又强大的AI模型来部署在边缘设备上,Gemma-3-270m绝对值得考虑。这个模型只有2.7亿参数,却继承了Gemini…...

MAX30101嵌入式驱动开发:寄存器配置与PPG信号处理

1. MAX30101嵌入式驱动库深度解析:从寄存器级控制到心率血氧算法集成MAX30101是Maxim Integrated(现为Analog Devices)推出的高集成度光学生物传感器模块,专为可穿戴设备和便携式医疗监测系统设计。该芯片集成了绿光/红光/红外LED…...

QCS6490实战解码:从参数到场景的性能跃迁指南

1. QCS6490硬件性能的实战价值解码 第一次拿到QCS6490开发板时,我对着参数表发呆了半小时——12TOPS算力、5路ISP、Wi-Fi 6E这些参数看起来很厉害,但到底能解决哪些实际问题?经过三个月的项目实战,我发现这款芯片的真正价值在于将…...

4步实现专业黑苹果配置:OpCore-Simplify零代码自动化解决方案

4步实现专业黑苹果配置:OpCore-Simplify零代码自动化解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是一款革命性…...