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程序启动时,都会创建一个主线程。如果没有在代码中明确创建其他线程…...
PyTorch复现网络模型VGG
VGG 原论文地址:https://arxiv.org/abs/1409.1556VGG是Visual Geometry Group(视觉几何组)的缩写,它是一个在计算机视觉领域中非常有影响力的研究团队,主要隶属于牛津大学的工程系和科学系。VGG以其对卷积神经网络&am…...
Springboot集成Javamelody
JavaMelody的目标是监视QA和生产环境中的Java或Java EE应用服务器。它不是模拟用户请求的工具,而是根据用户对应用程序的使用情况来衡量和计算应用程序实际操作的统计信息的工具。JavaMelody主要基于请求统计和演化图。 它允许改进QA和生产中的应用程序,…...
如何将 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语言版本# 更多配置信息可查阅࿱…...
「阿里云」幻兽帕鲁个人服务器已上线,3分钟快速搭建
基于阿里云搭建幻兽帕鲁服务器方法,1到2分钟部署完成,稳定运行无卡顿,阿里云服务器网aliyunfuwuqi.com分享保姆级手把手教程,基于阿里云计算巢、云服务器或无影云桌面都可以: 基于阿里云幻兽帕鲁服务器创建教程 基于…...
@ 代码随想录算法训练营第6周(C语言)|Day36(贪心)
代码随想录算法训练营第6周(C语言)|Day36(贪心) Day36、贪心(包含题目 ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间 ) 435. 无重叠区间 题目描述 给定一个区间的集合,找到需要…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
