【python中的协程了解一下?】

news2024/12/27 5:12:01

在这里插入图片描述

什么是协程

协程(Coroutine)是一种比线程更加轻量级的并发方式,它不需要线程上下文切换的开销,可以在单线程中实现并发。协程通常具有以下特点:

  • 协程中的代码可以暂停执行,并且在需要的时候可以恢复执行。
  • 多个协程可以在同一线程中并发执行,但是任意时刻只有一个协程在执行。
  • 协程通常是基于事件循环(Event Loop)实现的,事件循环负责调度协程的执行。

协程和线程

线程和协程都是实现并发编程的方式,但它们有一些不同的特点和应用场景。

**线程是操作系统调度的基本单位,**每个线程都拥有自己的执行上下文,包括线程栈、寄存器等。线程之间的切换需要进行上下文切换,包括保存当前线程的上下文,恢复另一个线程的上下文等操作,这些操作会耗费大量的时间和资源。在多线程编程中,线程切换是非常常见的操作,原因如下:

  1. 调度。当多个线程同时执行时,操作系统需要对这些线程进行调度,根据优先级等因素决定当前应该执行哪个线程。线程切换是调度的基本操作之一,通过切换线程,操作系统可以实现多个线程的并发执行。
  2. 等待。当一个线程需要等待某个事件发生时,例如等待 IO 操作完成、等待锁释放等,线程可以主动释放 CPU,使其他线程有机会执行。在等待完成后,线程可以被重新唤醒,继续执行。
  3. 并发。线程可以实现并发执行的效果,例如一个线程处理网络请求,另一个线程处理用户交互,这样可以提高系统的响应速度和处理能力。
  4. 切换到其他线程执行。在某些情况下,线程可能会因为一些原因无法继续执行,例如线程进入了死循环或者发生了异常,这时需要切换到其他线程执行,避免系统崩溃或者出现其他问题。

线程的并发编程通常会受到多线程竞争、死锁、上下文切换等问题的限制。在 Python 中,使用多线程编程需要注意线程安全、GIL 等问题。

协程是一种轻量级的并发方式,它是在用户空间中实现的,并不依赖于操作系统的调度。协程可以在同一个线程中实现并发,不需要进行上下文切换,因此执行效率非常高。协程通常使用事件循环(Event Loop)来调度协程的执行,事件循环会在协程需要等待 IO 操作或者其他协程时,暂停当前协程的执行,执行其他协程,从而实现并发执行的效果。在 Python 中,协程通常使用 asyncio 模块来实现,支持异步 IO、网络编程、任务调度等场景。

相对于线程,协程的主要优点包括:

  • 更加轻量级,占用的资源更少;
  • 不需要进行上下文切换,执行效率更高;
  • 可以使用事件循环进行调度,实现高并发的效果;
  • 不会受到 GIL 的限制,可以更好地利用多核 CPU。

然而,协程也有一些限制,例如无法利用多核 CPU、调试困难等问题。在选择使用线程还是协程时,需要根据具体的应用场景进行选择。

协程的应用

协程可以应用于很多场景,例如:

  • 网络编程:协程可以帮助我们实现高并发的网络应用。
  • 异步IO:协程可以帮助我们高效地处理异步IO操作。
  • 数据库操作:协程可以帮助我们实现高并发的数据库应用。
  • 任务调度:协程可以帮助我们实现高效的任务调度系统。

演示Demo

下面是一个示例代码,演示了如何使用协程和 asyncio 模块来实现一个简单的任务调度:

import asyncio

async def task1():
    print("Task 1")
    await asyncio.sleep(1)
    print("Task 1 done")

async def task2():
    print("Task 2")
    await asyncio.sleep(2)
    print("Task 2 done")


async def task3():
    print("Task 3")
    await asyncio.sleep(3)
    print("Task 3 done")


async def main():
    await asyncio.gather(task1(), task2(), task3())

这段代码使用了 Python 的协程和 asyncio 模块,定义了三个协程函数 task1task2task3,以及一个主协程函数 main。每个协程函数打印自己的任务名,然后暂停一段时间。主协程函数使用 asyncio.gather 并发执行了三个协程函数,最终输出结果为:

Task 1
Task 2
Task 3
Task 1 done
Task 2 done
Task 3 done
[Finished in 3.2s]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我的Qt作品(18)模仿Qt Creator IDE写了一个轻量级的视觉框架

Qt Creator的源码比较庞大。前几年我陆陆续续读过里面的源码。也写了几篇博文: https://blog.csdn.net/libaineu2004/article/details/104728857 https://blog.csdn.net/libaineu2004/article/details/89407333 最近一直想找机会,借用这个IDE的皮&…

谷歌Chrome浏览器在新标签页打开书签链接的五个方法

方法一:快捷键Ctrl/Command键 Ctrl/Command 左键单击书签 方法二:右键菜单建立新的标签页 在书签上单击右键选择【在新标签页中打开】 方法三:鼠标中键/拖拽到新标签页 拖拽方法:点击对应书签的文字或者图标——拖拽到浏览器…

Unity出模型动画的序列帧(特效序列帧)

模型动画的序列帧 我这里是通过Recorder和Timeline的结合操作,输出带有透明通道是序列帧图片 流程图 #mermaid-svg-ig9s3Ys4ZkUqP2IW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ig9s3Ys4ZkUqP2IW …

机器学习 day03(成本函数,简化后的和一般情况下的成本函数)

1. 成本函数 平方误差成本函数是最通常用于线性回归的成本函数最终,我们要找到一组w和b,让j函数的值最小误差:ŷ - y 2. 简化后的平方误差成本函数,即b 0 当w 1时,f(x) x,J(1) 0 左侧为f(x)函数&am…

QT笔记——信号转发器之QSignalMapper

QSignalMapper类可以看成是信号的翻译和转发器。 它可以把一个无参的信号翻译成带以下4种参数的信号再转发:int、QString、 QObject以及QWidget 。 应用场景一般是:有一些信号,发送的参数都是一样的情况下,常用的方法是给每一个信…

mapreduce基础: 手写wordcount案例

文章目录 一、源代码二、运行截图 一、源代码 WordCountMapper类 package org.example.wordcount;import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper;impo…

[架构之路-169]-《软考-系统分析师》-4-据通信与计算机网络-0-Ad hoc网络(分组无线网络)

目录 什么是Ad hoc网络 adhoc无线网络的历史 ad hoc特点 独立性 结构 通信带宽 主机能源 分布式特性 生存周期 物理安全 adhoc无线网络的结构 adhoc无线网络的应用 什么是Ad hoc网络 Ad hoc是一种多跳的、无中心的、自组织无线网络,又称为多跳网(M…

天龙八部手游服务端架设搭建教程

天龙八部手游服务端架设搭建教程 大家好,我是艾西。最近更新游戏搭建教程比较少也被不少小伙伴催更,今天我和大家聊聊天龙八部手游服务端架设搭建。 游戏讲述元佑元年,大宋遭受辽国入侵的故事,玩家可扮演峨眉、丐帮、天山、逍遥、…

SQL Server基础 第一章 (新建,分离,附加)

目录 前言 一,新建数据库 二,分离数据库 1,右键数据库,任务,分离 2,右键数据库,任务,分离 三,附加数据库 前言 本文主要详细介绍SQL server2019的简单使用&#xf…

ESP8266 +I2C SH1106 OLED仿数码管时钟

ESP8266 +I2C SH1106 OLED仿数码管时钟 📌相关篇《ESP8266 +I2C SSD1306 OLED仿数码管时钟》🎞🎬显示效果: 🔖本工程基于Arduino IDE框架下开发。🌿采用esp8266:Nodemcu📑配置参数信息: ✨在上面一篇的基础上做了改版,去除掉了原来在SSD1306那版中获取时间的NTP…

微信小程序制作

小程序是一种在移动设备上使用的轻量级应用程序,不需要下载安装,具有体积小、加载快和用户粘性高的优点。对于创业者和企业来说,开发一个小程序可以帮助他们拓宽商业渠道、增强品牌影响力和提升用户体验。那么,要开发一个小程序&a…

【Spring6】| 简述Spring中的八大模式

一:Spring中的八大模式 Spring中的八大模式,有很多我们前面已经讲过了,这里只需要大概有个印象,后期会出一个专门对23种设计模式的详解! 1. 简单工厂模式 BeanFactory的getBean()方法,通过唯一标识来获取…

51单片机(8051系列)最小系统图--内部时钟

最小系统电路图(无源晶振) 电容的作用 C1,C2:协助晶振起振(一般称为负载电容) 解释: 负载电容的计算公式CL C1*C2 / (C1C2) CS 其中CS为电路板的寄生电容一般取3~5pF 一般情况下&…

对表中数据进行删改,基础查询

目录 一.DML:对表中的数据进行增删改 二.DQL 一.DML:对表中的数据进行增删改 1.添加:insert 2.修改:update 3.删除:delete 二.DQL 1.基础查询: 2. 排序查询 3.聚合函数 概念:将一列数据作为一个整体&am…

带你彻底理解栈和队列

文章目录 前言一、栈是什么?二、栈的使用1.方法2.代码实现 三.栈的模拟四.队列1.方法2.代码实现3.循环队列4.双端队列 总结: 前言 今天,带你彻底理解栈和队列。 一、栈是什么? 栈英文叫做stack,是一种特殊的线性表。…

ARM busybox 的移植实战1

前言 先逐步构建 “文件夹形式”的根文件系统,然后制作烧录镜像。 (1) rootfs 有 2 种格式:nfs 方式启动的 “文件夹形式” 的 rootfs,和用来烧录的镜像形式的 rootfs。 (2) 我们先从空文件夹开始,逐步向其中添加一些 rootfs 中…

消息队列总结

消息队列 KafkaRocketMQRabbitMQActiveMQZeroMQMQ对比选型结论 消息队列的优点: 实现系统解耦实现异步调用流量削峰 消息队列的缺点: 系统可用性降低提升系统的复杂度数据一致性问题 Kafka Apache Kafka 是一个分布式消息发布订阅系统。它最初是由Li…

通过ObjectMapper和JsonNode 把JSON字符串转换成树结构数据和获取树节点数据

一.简介 今天同事有个需求&#xff0c;要把一个JSON字符串转换成一个树结构的数据并获取节点数据&#xff0c;鉴于自己不想写递归去转换&#xff0c;于是使用ObjectMapper和JsonNode类去实现。 二.依赖 pom文件引入依赖&#xff1a; <dependency><groupId>com.…

leetcode每日一题——美团笔试题【1】

今天分享两道算法题&#xff0c;自己刚开始练习&#xff0c;可能在解法上不是最佳的&#xff0c;但是只提供一些自己的思路&#xff0c;欢迎大家多多指教~ 第一题 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a;输入: s "lee…

NUC980驱动595与165扩展输入输出接口

一、电路图 3个165串联组成扩展24路光耦输入检测&#xff0c;一个595扩展8路继电器输出 二、驱动源码 #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/device.h>#include <linux/kernel.h> #in…