协程的概念,协程+遇到IO切换实现单线程提供并发

Python并发任务之协程 多线程会消耗系统资源,多进程则有GIL限制和影响,Python中还有一种高效地执行并发任务的方式,那就是协程了。 协程也成为微线程,比线程更轻量级。协程通过在单线程内进行函数执行切换来进行并发。也就是说,协程是单线程执行,并且在线程内函数之间的执行也是可以切换的。 如果说多进程、多线程是抢占式的任务处理方式,那么协程就是协作式的任务处理方式。协程虽然是单线程,但是通过协作切换来充分利用CPU,... 阅读详情

1、协程是什么?

协程,英文为coroutine,也被称作轻量级线程或者微线程,是一种用户态的轻量级线程。协程的执行不是由系统内核来调度,而是由用户程序自行控制。这意味着协程的切换非常快,几乎只涉及到几个寄存器的内容变更。

协程的主要思想是控制权来回切换,在函数执行过程中,如果遇到了等待IO操作,程序会暂时将控制权交回给用户,用户可以控制协程切换到其他函数执行,等到IO操作完成后,再通过某种方式将控制权交回原来的协程,继续执行。这种切换过程相比于线程的上下文切换开销非常小。

2、进程、线程、协程的区别?

进程、线程和协程是操作系统中处理任务的基本单位,它们有以下区别:

  • 进程(Process):进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。每个进程都拥有独立的内存空间和系统资源。进程之间的通信(IPC,inter-process communication)需要经过操作系统进行中转,因此开销较大。
  • 线程(Thread):线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程之间的切换开销相对较小。
  • 协程(Coroutine):协程是一种用户态的轻量级线程,协程的调度完全由用户程序自行控制。协程有点类似于线程,但协程完全在用户态下执行,不需要内核的参与。协程的切换开销非常小,几乎只涉及到几个寄存器的内容变更。

python代码: 

# 协程
# 进程,操作系统中存在
# 线程,操作系统中存在
# 协程,是由程序员创造出来的一个不是真实存在的东西
# 协程:是微线程,对一个线程程序分片,使得线程在代码块之间来回切换执行,不是在原来遂行执行
import greenlet
def f1():
    print(11)
    gr2.switch()
    print(22)
    gr2.switch()

def f2():
    print(33)
    gr1.switch()
    print(44)

# 协程1
gr1=greenlet.greenlet (f1)
# 协程2
gr2=greenlet.greenlet (f2)
gr1.switch()

# 单纯的协程无用,而且会降低性能(来回切换)
print("#######################")
def f11():
    print(11)
    print(33)

def f22():
    print(22)
    print(44)

f11()
f22()

 运行结果;

3、协程可以提高并发?

虽然协程可以使得单线程内的并发性提高,但是它本身并不能实现真正的并发。因为在一个时间点,只有一个协程在执行。要想实现真正的并发,通常会使用多线程或多进程。但是,对于IO密集型任务,使用协程结合事件循环的异步非阻塞框架可以获得更高的性能。这是因为,相比于线程和进程,协程在切换时的开销非常小。

注意:单纯的协程无用,而且会降低性能(来回切换)

4、单线程提供并发:

在单线程中实现并发的一种方式是使用协程+IO切换的方式,例如使用Python的gevent库。另一种方式是使用基于事件循环的异步非阻塞框架,例如Twisted。这两种方式都可以实现在单线程中提高程序的并发性能。

协程+IO切换 实现单线程提供并发:

# 协程+遇到IO就切换=>才有意义
from gevent import monkey
monkey.patch_all()
#以后代码中遇到I0,都会自动执行greenlet的switch,进行切换
import requests
import gevent
def get_page1(url):
    ret = requests.get(url)
    print(url,ret.content)

def get_page2(url):
    ret = requests.get(url)
    print(url,ret.content)

def get_page3(url):
    ret = requests.get(url)
    print(url,ret.content)

gevent.joinall([ gevent.spawn(get_page1, 'https://www.python.org/'),#协程1
                gevent.spawn(get_page2, 'https://www.yahoo.com/'),#协程2
               gevent.spawn(get_page3, 'https://github.com/'),]) #协程3

 5、总结:

# 1.什么是协程?
# 协程也可以称为“微线程”,就是开发者控制线程执行
# 控制先执行某段代码,然后再切換到另外函数执行,来回切换

# 2.协程可以提高并发?
# 协程自己本身无法实现并发(甚至性能会降低)。
# 协程+IO切换,性能提高。

# 3.进程、线程、协程的区别?

# 4.単线程提供井发:
# -协程+IO切换:gevent
# -基于事件循环的异歩非阻塞框架:Twisted
SWIFT报文格式解析:从MT103到MT760,这些金融电文你了解多少? 本文深入解析SWIFT报文格式中的MT103与MT760,详细介绍了这两种金融电文的结构、应用场景及实操技巧。MT103用于国际汇款业务,MT760则适用于银行保函开立,两者在国际金融交易中扮演关键角色。文章还提供了常见问题解决方案和自动化处理建议,帮助金融从业者高效处理跨境业务。 阅读详情

相关推荐

PSINS惯性系初始对准与代码解读

本文参考“摇摆基座上基于信息的捷联惯导粗对准研究”(秦永元),以及“严恭敏博士后研究报告”,详细解读并推导了静基座惯性系对准算法,并与PSINS代码进行对照解读。

u011012050的博客 6755

理解协程,以及协程如何提升IO阻塞时的性能

阅读这篇文章,你将会了解: 1.协程的概念 2.进程、线程、线程的区别 3.协程有什么好处,如何提升性能 一.概念: 1.协程是在线程下的,线程内的多个协程通过协程的调度获得cpu时间。但是线程内的多个协程肯定是串行的。即线程下的某个协程在运行时,其他协程必然是挂起,没有在运行。 2.一个进程可以有多个线程,一个线程可以用多个协程。 二.进程、线程、协程三者的上下文切换比较 进程 线...

Java程序员的进阶之路 4752

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py库,详细演示了如何读取HDF5文件结构、理解数据分类(如传感器、健康参数、场景描述符)并加载为Pandas DataFrame。文章还澄清了数据集中常见的变量数量疑惑,并给出了从数据加载到构建剩余使用寿命预测模型预处理流水线的完整代码,帮助工程师和研究人员高效入门航空发动机预测性维护分析。

weixin_29057065的博客 422

11、协程和io教程01 -- 并发 并行 同步 异步 阻塞 非阻塞 以及 IO多路复用概念和讲解

01、协程预先铺垫 --协程这一章比线程更加复杂,需要和socket那两章混合起来学习学习 02、并发 并行 --并发:一个时间段内【不是一个时间点】,运行多个程序。但是每一时刻cpu中只能有一个程序在执行,那么这些执行的程序就是处于并发状态的。 --并行:同一时刻,多个代码同时运行在多个cpu上,代码处于并行状态 03、同步 异步 --同步:当出现IO操作时,必须等待IO操作返回时才继续执行的操作称为同步。不涉及到IO操作时不需要考虑是否同步 --异步:不需要等待IO操作执行完毕返回结

weixin_41097516的博客 699

Win10 / Win11 启用 Hyper-V 虚拟机详细教程(图文+命令行全攻略)

摘要:本文详细介绍Windows10/11系统启用Hyper-V虚拟化平台的方法,包含专业版/企业版的图形界面和PowerShell命令行操作,以及家庭版通过脚本强制启用的特殊方案。内容涵盖版本支持对比、操作步骤图解、常见问题解答和性能优化建议,帮助开发者快速搭建虚拟化环境进行多系统测试。附微软官方文档参考链接和详细操作示意图。

ElioXu 7083

python编程实现制作网络流量监控动画

c,实时显示网络带宽使用情况,用柱状图或折线图表示不同时间段的流量变化。通过 Python编程实现图形库(如 Pygame、Tkinter、Matplotlib 等)来实现计算机网络基础概念的可视化动画。global bars # 声明 bars 为全局变量。# 获取当前网络流量。# 创建图形和坐标轴。

qq_42788199的博客 718

学习笔记 ——协程

通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。从上面的描述来看,我们更容易理解一个IO操作,应用程序和操作系统都干了些什么,也帮助我们更容器理解阻塞和非阻塞,异步和同步的相关IO编程概念。以一个读取数据的IO操作而言,在操作系统将外部数据写入进程缓冲区这个期间,进程或线程挂起等待操作系统IO执行完成的话,这种IO执行策略就为。

qwertyuiop14242的博客 231

新手小白 必须精进的 “ FLASH分区管理Code and Data ” !!!最强文章解析!!!

FLASH“代码区”和“数据区”不是每个项目都必须显式管理,但只要你的产品功能越来越丰富,对可靠性和扩展性要求提高,就一定要学会科学划分和使用。这也是嵌入式工程师进阶路上的必修课!

qq_75157958的博客 935

协程:单线程并发开发的高效利器

协程是一种轻量级的用户态多任务调度方式,运行在单个线程中,由开发者控制其执行流程。与线程相比,协程的创建和切换成本更低,适用于I/O密集型任务,如网络请求和文件读写。协程通过协作式调度实现伪并发,在单线程中交替执行多个任务。协程的基本原理包括挂起、恢复和事件循环,可以通过生成器、greenlet和gevent等工具实现。gevent库提供了自动切换的能力,特别适合处理高并发I/O操作。协程在网络爬虫、Web服务器和高并发通信等场景中表现出色,相较于线程,协程在内存消耗和CPU开销方面更具优势。

qq_45280097的博客 1038

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

【YOLOv11改进 - 特征融合】DySample :超轻量级且高效的动态上采样器

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1072

基于Multisim/TINA的H桥电机驱动电路设计与仿真分析

摘要 本文基于Multisim/TINA仿真平台,对H桥电机驱动电路进行了系统设计与分析。研究重点包括H桥拓扑结构的工作原理、PWM调速控制方法以及两种驱动方案对比分析。通过光耦隔离驱动与IR2110专用驱动IC的仿真对比,验证了IR2110自举电路在高低侧驱动中的优势。仿真实验着重分析了死区时间对防止直通现象的关键作用,并建立了直流电机的R-L-E等效模型进行动态特性仿真。结果表明,采用IR2110驱动方案配合适当的栅极电阻和自举电容参数,能够实现电机的高效双向调速控制。本研究为实际电机驱动系统的设计提供

huanghm88的专栏 140

python gevent缺点_python 协程 greenlet gevent

一、并发的本质切换+保存状态cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长时间片到了二、协程协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。1. python的线程属于内核级别的,即由操作系统...

weixin_39569747的博客 258

基于STM32设计的智能水产养殖系统(2025)_359

本设计提出并实现了一种基于STM32F103RCT6微控制器的智能水产养殖控制系统,针对传统水产养殖中人工依赖高、环境参数监测滞后、控制手段单一等问题,集成了TDS水质检测、水温检测、水位监测、自动喂食、自动充氧、换水控制与加热保温等功能。系统采用ESP8266模块实现WIFI联网,通过MQTT协议将关键数据上传至华为云物联网平台,支持Android手机APP和Windows上位机远程监测与控制。同时,系统具备本地LCD数据显示与蜂鸣器异常报警功能,支持本地按键控制操作。整套系统功能完善,响应灵敏,运行稳定

627

python协程

进程是资源分配的最小单位,线程是cpu调度的最小单位 协程是什么东西呢? 今天就简单的梳理一下: 我们在不断追求更高的执行效率,追求高并发,合理利用资源,利用时间。 你想想单线程如果有并发效果,是不是就嗨了。 协程的本质就是在单线程下,由用户自己控制一个任务遇到io阻塞了就切换另外一个任务去执行,以此来提升效率。 可以控制多个任务之间的切换,切换之前将任务的状态保存下来,以便重新运行时,可以基于暂...

zhaojikun521521的博客 362

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python协程、线程、进程异步同步差异

同步: 多任务, 多个任务之间执行的时候要求有先后顺序,必须一个先执行完成之后,另一个才能继续执行, 只有一个主线 异步: 多任务, 多个任务之间执行没有先后顺序,可以同时运行,执行的先后顺序不会有什么影响,存在的多条运行主线 阻塞:从调用者的角度出发,如果在调用的时候,被卡住,不能再继续向下运行,需要等待,就说是阻塞 非阻塞: 从调用者的角度出发, 如果在调用的时候,没有被卡住,能够继续向下运行...

YPL_ZML的博客 426

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

协程

socket发送请求:两种方式 方式一: import socket import requests key_list=['alex','db','sb'] for item in key_list: ret = requests.get('https://www.baidu.com/s?wd=%s' %item) 方式二: import socket ...

weixin_30729609的博客 92

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

协程的概念,为什么要用协程,以及协程的使用

什么是协程 协程, 又称为微线程,是一种用户态的轻量级线程。协程不像线程和进程那样,需要进行系统内核上的上下文切换,协程的上下文切换是由开发人员决定的。 协程是一种用户级的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,...

weixin_44575037的博客 2万+

深入理解 Python 协程:单线程下的高效并发方案

协程通过用户态调度和轻量级切换,在单线程内实现了高效的任务并发,尤其适合处理 IO 密集型场景。相比传统线程,它以更低的资源消耗实现了更高的吞吐量,成为 Python 异步编程的核心技术之一。随着 Python 生态的发展,协程与异步框架(如 FastAPI、Quart)的结合日益紧密,未来有望在云原生、边缘计算等领域发挥更大作用。对于开发者而言,掌握协程技术不仅能提升程序性能,更能深入理解异步编程的核心思想,为复杂系统设计提供新的思路。

2201_75786273的博客 1593

python异步IO并发单线程协程gevent

转载自https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152 在学习异步IO模型前,我们先来了解协程。 协程,又称微线程,纤程。英文名Coroutine。 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过...

Peter的博客 707

协程是单线程的做事情,但是io是阻塞的,协程是如何不会阻塞的呢?

协程是单线程下的并发实现方式,而I/O操作通常是阻塞的。然而,协程能够避免被I/O操作阻塞,关键在于其运行机制和调度方式。

qq_43664361的博客 1048

Python之并发编程协程

协程介绍,Greenlet,Gevent介绍,Gevent之同步与异步,Gevent之应用举例

weixin_47035302的博客 667

python多进程单线程+协程实现高并发

并发:看起来像同时运行就是并发 并行:同一时间同时被执行叫做并行,最大并行数就是CPU核数 协程不是实实在在存在的物理基础和操作系统运行逻辑,只是程序员从代码层面避开了系统对遇到IO的程序会切走CPU资源的一种方法,在IO密集型任务中,通过协程,可以让CPU尽可能多的时间在本程序上执行,由于协程的原理是遇到IO及让cpu去执行其他代码,不停的来回切,在基于socket TCP通信中,这便为并发...

weixin_30824277的博客 525

python并发之协程_python并发编程之协程

一 引子本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,...

weixin_29284201的博客 174

Python并发之协程

协程,又称微线程,纤程。英文名Coroutine。协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

上善若泪 4160

并发编程 协程 | IO模型简介

协程 前传   之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。   随着我们对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题,即只用一个主线程(很明显可利用的...

weixin_46407419的博客 168

进程池和线程池、协程、TCP单线程实现并发

一、进程池和线程池 当被操作对象数目不大时,我们可以手动创建几个进程和线程,十几个几十个还好,但是如果有上百个上千个。手动操作麻烦而且电脑硬件跟不上,可以会崩溃,此时进程池、线程池的功效就能发挥了。我们可以通过维护一个进程池、线程池来控制进程数目和线程数目。在保证计算机硬件安全的情况下最大限度的利用计算机,池其实是降低了程序的运行效率,但是保证了计算机硬件的安全。 注意点:在使用进程...

ailengjiu5238的博客 208
上一篇: 网络编程重要知识点总结
下一篇: socket实现web应用的本质
python_198
博客等级 码龄3年 359粉丝 112原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python_198

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值