当前位置: 首页 > 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. 无重叠区间 题目描述 给定一个区间的集合,找到需要…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...