Python 协程:并发编程的轻量级利器
一、协程是什么?
协程是一种比线程更加轻量级的存在。它可以在特定的点暂停执行,然后在后续某个时刻恢复执行,并且能够在暂停期间保存其执行状态。与传统的多线程模型不同,协程不需要操作系统进行线程上下文切换的开销,因为所有的协程都在同一个线程中运行,它们之间的切换是由程序员手动控制或者通过特定的库来调度的。
二、协程实现
Python 提供了多种方式来实现协程,其中较为常用的是 asyncio 库。asyncio 是 Python 内置的异步 I/O 框架,它基于协程和事件循环机制来实现异步编程。
-
基本协程函数定义
import asyncioasync def my_coroutine():print("协程开始执行")await asyncio.sleep(1) # 模拟异步操作,这里暂停 1 秒print("协程执行结束")
在这个例子中,my_coroutine 就是一个简单的协程函数,await 关键字用于暂停协程的执行,直到等待的异步操作(这里是asynicion.sleep)完成。
-
运行协程
要运行协程,我们需要将协程对象放入事件循环中。asyncio 提供了 run 函数来方便地启动事件循环并运行协程:
asyncio.run(my_coroutine())
并且在协程执行 await asyncio.sleep(1) 时,会暂停 1 秒,但不会阻塞整个线程,其他协程或异步操作可以在此期间继续执行。
三、协程的并发与任务调度
协程的真正强大之处在于可以实现多个协程的并发执行。asyncio 中通过 task 对象来对协程进行调度和管理。
我们可以使用 asyncio.create_task
函数来创建一个任务并将其添加到事件循环中:
import asyncio
import datetimeasync def coroutine_1():print(f"{datetime.datetime.now().strftime('%H:%M:%S')}协程 1 开始")await asyncio.sleep(2)print(f"{datetime.datetime.now().strftime('%H:%M:%S')}协程 1 结束")async def coroutine_2():print(f"{datetime.datetime.now().strftime('%H:%M:%S')}协程 2 开始")await asyncio.sleep(1)print(f"{datetime.datetime.now().strftime('%H:%M:%S')}协程 2 结束")async def main():task1 = asyncio.create_task(coroutine_1())task2 = asyncio.create_task(coroutine_2())await task1await task2asyncio.run(main())
在这个例子中,main 协程创建了两个任务 task1 和 task2,分别对应coroutine_1 和coroutine_2。然后,main 协程通过 await 等待这两个任务完成。
13:11:06协程 1 开始
13:11:06协程 2 开始
13:11:07协程 2 结束
13:11:08协程 1 结束
流程解释:
- 使用 asyncio.run(main())
- 在 main 协程中,asyncio.create_task创建了两个任务task1和task2。这些任务被添加到事件循环的任务队列中。(注意,此时task1和task2两个协程已经再事件循环队列了,可以被执行了)
-
coroutine_1 中的 await asyncio.sleep 语句会暂停协程的执行,并将控制权交回给事件循环。事件循环可以在此期间选择执行其他任务。例如,coroutine_2 中的 await asyncio.sleep (1) 会让协程 2 暂停 1 秒,但在此期间,事件循环可以去执行 coroutine_1,因为 coroutine_1 中的 await asyncio.sleep (2) 还没有结束。
-
如果没有 await task1 和 await task2,main 协程会在创建 task1 和 task2 后就立即结束。因为 asyncio.create_task 是一个非阻塞操作,它只是将协程任务添加到事件循环的任务队列中,然后继续执行 main 协程的下一行代码。而由于 main 协程没有其他内容,就会直接结束。当 main 协程结束后,asyncio.run (main ()) 也会随之结束,因为 asyncio.run 函数会在 main 协程结束后清理资源并关闭事件循环。这就导致 coroutine_1 和 coroutine_2 可能还没来得及执行就被终止了,因为它们所在的任务还没被充分调度和执行,事件循环就已经关闭。
四、协程在实际应用中的优势
在网络编程中,协程可以极大地提高服务器的并发处理能力。例如,在一个简单的 HTTP 服务器中,处理每个客户端请求的过程可能涉及到网络数据读取、数据库查询等 I/O 操作。使用协程,服务器可以在处理一个请求的 I/O 等待期间,切换到处理其他请求,而不是像传统的多线程模型那样,每个线程在等待 I/O 时都处于阻塞状态,占用系统资源。
发起异步网络请求方法:
async def fetch(session, url):try:async with session.get(url) as response:return await response.text()except aiohttp.ClientError as e:print(f"请求 {url} 时出现错误: {e}")return None
批量发起http请求:
async def main():urls = ["https://www.example.com","https://www.python.org","https://www.github.com","https://www.baidu.com"]async with aiohttp.ClientSession() as session:tasks = [fetch(session, url) for url in urls]results = await asyncio.gather(*tasks)for url, result in zip(urls, results):if result:print(f"成功获取 {url} 的内容,长度为: {len(result)}")else:print(f"未能成功获取 {url} 的内容")if __name__ == "__main__":asyncio.run(main())
向上面那样就可以批量的执行http请求。
五、总结
协程是轻量级、高效的并发编程方案。借助 asyncio 库,能便捷定义、运行和调度协程,并发执行多个异步任务,在处理 I/O 密集型任务时可提升程序性能。掌握协程编程技巧,利于开发高效、响应快的 Python 应用程序,在网络服务、数据处理等含大量异步操作的场景中很有用。
相关文章:
Python 协程:并发编程的轻量级利器
一、协程是什么? 协程是一种比线程更加轻量级的存在。它可以在特定的点暂停执行,然后在后续某个时刻恢复执行,并且能够在暂停期间保存其执行状态。与传统的多线程模型不同,协程不需要操作系统进行线程上下文切换的开销,…...
理解JVM
JVM简介 JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统 常见的虚拟机: JVM 、 VMwave 、 Virtual Box JVM 和其他两个虚拟机的区别: 1…...
GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录
文章目录 论文背景Spectre-PHT(Transient Execution )Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复flush and reload 论文 https:/…...
【环境搭建】使用IDEA远程调试Dolphinscheduler
以Dolphinscheduler-3.1.8为例,先把容器起了: $ docker pull apache/dolphinscheduler-standalone-server:3.1.8 $ docker run -d -p 12345:12345 -p 25333:25333 -p 5005:5005 -d apache/dolphinscheduler-standalone-server:3.1.8下载Dolphinschedule…...
强基计划之编程:开启科研精英培养新路径
强基计划之编程:开启科研精英培养新路径 一、强基计划概述 1. 出台背景 在 2003 年,教育部开启高校自主招生改革,于探索综合评价学生、破除招生“唯分数论”等方面收获一定成效。相关调查研究显示,自主招生所录取的学生在入校后…...
奇怪问题| Chrome 访问csdn 创作中心的时候报错: 服务超时,请稍后重试
Chrome 访问csdn 创作中心的时候报错: 服务超时,请稍后重试用无痕浏览器可以正常访问 关闭代理无效清缓存和Cookies无效。考虑无痕浏览器模式下插件不生效,尝试把chrome 插件也禁用,发现有效,是该扩展程序的缘故...
Spring Boot 教程之三十六:实现身份验证
如何在 Spring Boot 中实现简单的身份验证? 在本文中,我们将学习如何使用 Spring设置和配置基本身份验证。身份验证是任何类型的安全性中的主要步骤之一。Spring 提供依赖项,即Spring Security,可帮助在 API 上建立身份验证。有很…...
设计模式中单例模式中懒汉模式的问题
设计模式中单例模式中懒汉模式的问题 今天在项目中遇到了要使用懒汉模式的问题。百度之后,发现还有很多细节是自己之前没有见过的。于是记录一下。下面是在AI助手中的说明。 单例模式的懒汉模式(Lazy Singleton)是在需要时才创建实例&#…...
【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析
引言 在数据排序的世界里,选择排序是一类简单而直观的算法,它通过不断选取未排序部分中的最小(或最大)元素来逐步构建有序序列。今天,我们将深入探讨两种基于选择思想的排序方法——直接选择排序和堆排序,…...
力扣48.旋转图像
文章目录 一、前言二、原地旋转 一、前言 力扣48.旋转图像 这道题要求把给定矩阵旋转90度,并且不允许使用额外矩阵来完成旋转图像。 于是这道题只能使用原地旋转的方法来解决 二、原地旋转 对于一个N3的矩阵来说,只需要两次循环就可以完成了 将A1放到…...
jdk1.8新特性、jvm内存结构、垃圾回收
一、JDK 1.8 也被称为 Java 8,有许多重要的新特性: 1、Lambda 表达式: 它允许把函数作为一个方法的参数(函数作为值传递),可以用更紧凑的方式来表示匿名内部类了例如: new Thread(new Runnable() {Overr…...
MFC/C++学习系列之简单记录13
MFC/C学习系列之简单记录13 前言memsetList Control代码注意 总结 前言 今天记录一下memset和List control 的使用吧! memset memset通常在初始化变量或清空内存区域的时候使用,可以对变量设定特定的值。 使用: 头文件: C&#…...
RabbitMQ中的Topic模式
在现代分布式系统中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理,支持多种消息传递模式,其中 Topic 模式 是一种灵活且强大的模式,允许生产者…...
苹果手机怎么清理空间:拯救你的拥挤手机
在数字生活的海洋中,我们的苹果手机就像一艘小船,载满了照片、应用、视频和各种下载的“宝贝”。随着时间的推移,这艘小船开始变得拥挤,航行速度放缓,甚至有时候直接卡壳。苹果手机怎么清理空间?是时候学会…...
实习冲刺数据库练习-01 基础查询
原题链接:牛客网在线编程_SQL篇_非技术快速入门 数据表示例: 根据数据表示例要求我们完成以下查询: (1)获取用户信息表中所有的数据,请你取出相应结果 (2)获取用户的设备id对应的…...
GAN网络详解及涨点大全总结(源码)
(需要源码请私信或评论) GAN原理 GAN的基本原理建立在 生成模型和判别模型的博弈过程 上。这种独特的机制使得GAN能够在复杂的分布上实现高效的无监督学习。在这个过程中,生成器G和判别器D相互竞争,最终达到一种平衡状态,在此状态下,G能够产生高质量的合成样本,而D则无…...
前端关于pptxgen.js个人使用介绍
官方文档链接:Quick Start Guide | PptxGenJS git地址:https://github.com/gitbrent/PptxGenJS/ 1. 安装命令 npm install pptxgenjs --save yarn add pptxgenjs 2. 示例demo import pptxgen from "pptxgenjs"; // 引入pptxgen // 1. Create a Presenta…...
Webrtc音频模块(四) 音频采集
音频的采集还是封装在AudioDeviceWindowsCore中,相关的Core Audio API接口是下面几个: IAudioClient* _ptrClientIn IAudioCaptureClient* _ptrCaptureClient rtc::scoped_refptr<IMediaObject> _dmo rtc::scoped_refptr<IMediaBuffer> _me…...
乘积小于K的子数组
要解决“乘积小于 k 的子数组”问题,可以使用滑动窗口技术。下面是详细的步骤和思路: 初始化变量: 定义两个指针 left 和 right,都初始化为 0,用于表示窗口的左右边界。一个 product 变量初始化为 1,用于存…...
vue的ElMessage的css样式不生效
我使用elementplus,是使用的用哪个单独引入的,然后表单校验时候警告的css不生效,就是这个效果 反复看视频的引入也没发现问题,后来才知道需要这个引入 import { ElMessage } from "element-plus"; import element-pl…...
视频会议系统如何对接电话会议系统?
视频会议系统如何对接电话会议系统? 作者:开源视频会议系统BigBlueButton&BBBEasy中国区团队,Github地址:https://github.com/lihaiya/bigbluebutton 视频会议系统与电话会议系统的对接,是现代企业通信整合的重要…...
亚马逊API接口深度解析:如何高效获取商品详情与评论数据
在当今数字化时代,电商平台的数据对于商家和开发者来说至关重要。亚马逊作为全球领先的电商平台,其API接口为开发者提供了丰富的商品信息和评论数据。本文将深入探讨如何使用亚马逊API接口获取商品详情和商品评论,同时提供简洁明了的使用方法…...
1222面经
1,Kafka 如何保障顺序消费? Kafka 保障顺序消费主要通过以下几个关键机制和配置来实现: 分区策略 Kafka 将主题划分为多个分区,每个分区内的消息是天然有序的,其按照消息发送到分区的先后顺序进行存储和追加。生产者在发送消息…...
271-基于XC7V690T的12路光纤PCIe接口卡
一、板卡概述 基于XC7V690T的12路光纤PCI-E接口卡,用于实现多通道高速光纤数据接收和发送,板卡兼容PCIe 2.0和PCIe 3.0规范,利用PCI-E Switch PEX 8748实现FPGA芯片与计算机的通信,计算机与板卡接口处提供PCI-e 16速接口ÿ…...
完成第一个 Vue3.2 项目后,这是我的技术总结
第一次Composition API 在vue3.2中,正式支持了script setup的写法,这样可以大大简化组件的代码量,减少一些重复操作,我认为当你写vue3时,应该把这当作默认写法。在vue3.2之前,一般会这样写。 <script>export de…...
类的动态演绎:程序运行中的生命绽放
任务1.按照要求设计类(根据输出设计类) 设计类就是根据数据封装的要求,抽象出适合的类。 有如下情况的测试程序和测试程序的输出结果,要求设计类Smile。 (一)第1种情况: (1)测试程序如下&#x…...
从代币角度介绍solana账户体系
1、solana 的账户概念介绍 Solana的账户体系是其区块链的核心组成部分,它允许数据和价值在链上存储和转移。以下是Solana账户体系的一些关键特点: • 账户模型: • 在Solana上,所有数据都存储在所谓的“账户”中,类似…...
Python pygame 主副屏编程时 在副屏上全屏窗口的方法
Python在windows环境中编程时,用pygame工具包能够很轻易的完成2D游戏的简单设计,非常好用,相关帖子很多。 而当电脑连接了多块显示器时(注意不是windows的多桌面),系统选择扩展这些显示器后,可…...
服务器数据恢复—V7000存储中多块磁盘出现故障导致业务中断的数据恢复案例
服务器存储数据恢复环境: 一台V7000存储上共12块SAS机械硬盘(其中1块是热备盘),组建了2组Mdisk,创建了一个pool。挂载在小型机上作为逻辑盘使用,小型机上安装的AIXSybase。 服务器存储故障: V7…...
Qt开发经验 --- 避坑指南(2)
文章目录 1、 Heob窗口变得非常长,配置名称是一长串乱码2、 Qt安装报错 From 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platform plugin.3、Cmake编译错误找不到libwinpthread-1.dll4、CMake编译找不到mingw5、linux下qtcreator启动报错…...
2.4 网络概念(分层、TCP)
网络层与传输层概述 网络层: 抽象概念:网络层是基于 IP 的抽象概念,与数据链路层用 MAC 地址标记设备不同。MAC 地址是一种具体化的概念,绑定于所在的物理网络,而 IP 地址可以是固定的,也可以通过路由动态…...
Elasticsearch问题总结
Fielddata access on the_id field is disallowed, you can re-enable it by updating the dynamic cluster setting: indices.id_field_data.enabledElasticsearch默认禁用_id字段进行排序,这是因为_id字段通常不需要进行聚合或排序操作,启用字段数据可…...
C++点云大文件读取
C点云大文件读取 1. 常规读取1.1 逐行读取1.2 逐字节读取 2. 并行读取 (Multithreading)3. 使用缓冲读取 (Buffered I/O)4. 内存映射文件 (Memory Mapping) 在C中读取大文件时,如果需要提高读取速度,可以考虑以下几种方法: 1. 常规读取 常规…...
Hololens 2 Unity VS2019编译报错解决方案
报错问题描述不够详细,但是针对Hololens 2和Unity开发环境中的VS2019编译错误,以下 是一些常见的问题及其解决方案: 1.缺少或错误的Unity版本 确保安装了支持Hololens 2的Unity版本(例如2019.3或更高)。 2.缺少C工作负载 打开Visual Studio Installe…...
【Cadence射频仿真学习笔记】IC设计中电感的分析、建模与绘制(EMX电磁仿真,RFIC-GPT生成无源器件及与cadence的交互)
一、理论讲解 1. 电感设计的两个角度 电感的设计可以从两个角度考虑,一个是外部特性,一个是内部特性。外部特性就是把电感视为一个黑盒子,带有两个端子,如果带有抽头的电感就有三个端子,需要去考虑其电感值、Q值和自…...
记录:virt-manager配置Ubuntu arm虚拟机
virt-manager(Virtual Machine Manager)是一个图形用户界面应用程序,通过libvirt管理虚拟机(即作为libvirt的图形前端) 因为要在Linux arm环境做测试,记录下virt-manager配置arm虚拟机的过程 先在VMWare中…...
Qt Quick:CheckBox 复选框
复选框不止选中和未选中2种状态哦,它还有1种部分选中的状态。这3种状态都是Qt自带的,如果想让复选框有部分选中这个状态,需要将三态属性(tristate)设为true。 未选中的状态值为0,部分选中是1,选…...
腾讯云云开发 Copilot 深度探索与实战分享
个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代,…...
Linux应用开发————mysql数据库表
mysql数据库表操作 查看表的结构 mysql> desc / describe 表名; 或者: mysql> show create table 表名; 常见数据库引擎: innodb, myISAM... 删除表 mysql> drop tabl…...
《军工记忆》第二季播出,科技创新铸国之重器
2019年8月1日晚20点,《军工记忆》第二季在央视纪录频道(CCTV-9)播出,第一集《第一颗氢弹》首当其冲,为我们生动描绘了氢弹研制过程的艰难岁月,重现中国军工事业的漫漫长路,科技创新铸国之重器。…...
linux 无网络安装mysql
下载地址 通过网盘分享的文件:mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz 链接: https://pan.baidu.com/s/1qm48pNfGYMqBGfoqT3hxPw?pwd0012 提取码: 0012 安装 解压 tar -zxvf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz mv /usr/mysql-5.7.33-linux-glibc2.1…...
如何使用Python进行音频片断合成
以下是几种使用 Python 进行音频合成的方法: 使用 synthesizer 库 通过 pip install synthesizer 安装后,利用其提供的合成器类,可自定义振荡器类型,如锯齿波、方波或正弦波,并调制振幅来创造不同音色,还…...
【SH】在Ubuntu Server 24中基于Python Web应用的Flask Web开发(实现POST请求)学习笔记
文章目录 Flask开发环境搭建保持Flask运行Debug调试 路由和视图可变路由 请求和响应获取请求信息Request属性响应状态码常见状态码CookieSession 表单GET请求POST请求 Flask 在用户使用浏览器访问网页的过程中,浏览器首先会发送一个请求到服务器,服务器…...
方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC]
文章目录 方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现方正畅享全媒体采编系统reportCenter.do接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利…...
SpringBoot Redis 消息队列
文章目录 参考消息队列list源码 pub/sub源码 参考 https://www.cnblogs.com/uniqueDong/p/15904837.html https://www.cnblogs.com/wzh2010/p/17205390.html https://blog.csdn.net/qq_16557637/article/details/121015736 https://developer.aliyun.com/article/1095035 http…...
Oracle 中间件 Webcenter Portal服务器环境搭建
环境信息 服务器基本信息 如下表,本次安装总共使用2台服务器,具体信息如下: Webcenter1服务器 归类 SOA服务器 Ip Address 172.xx.xx.xx.xx HostName wcc01.xxxxxx.com Alias wccprd01 Webcenter2服务器 归类 OSB服务器 Ip Addr…...
域名和服务器是什么?域名和服务器是什么关系?
在互联网的生态系统中,域名和服务器是两个至关重要的组成部分。它们共同构成了我们访问网站和使用在线服务的基础。那么域名和服务器是什么?域名和服务器是什么关系? 1、域名的概念 域名是互联网中用于标识特定地址的一种文字形式。它是用户访问网站时输入的易记…...
设计模式-观察者模式
背景 气象站需要将每天测量到的温度、湿度、气压等数据公布出去, 需要设计开放的API,以便第三方获取气象站的数据, 如果数据有更新,能及时地通知第三方 传统思路: 创建WeatherData类,有温度、湿度、气…...
获取显示器(主/副屏)友好名称(FriendlyName)
在开发涉及多显示器的应用程序时,获取显示器的友好名称(Friendly Name)是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法,了解其实现细节和工作原理。 方法签名 public static string GetMonitorFriendlyName(bool i…...
打造智慧医院挂号枢纽:SSM 与 Vue 融合的系统设计与实施
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...