进程线程协程

协程(coroutine)是一种更轻量级的并发编程方式,它可以在一个线程内实现多任务的切换和执行。与进程和线程相比,协程有其独特的特点和优势。

理解协程

协程是一种可以暂停和恢复执行的函数。与传统函数不同,协程可以在执行过程中被暂停,并在稍后继续执行,从而允许在单个线程内实现并发。协程的主要特点包括:

  1. 非抢占式调度:协程的切换是由程序显式控制的,不像线程那样由操作系统抢占调度。
  2. 轻量级:协程的创建和切换开销比线程和进程小得多,因为协程只是程序中的函数,而不是独立的操作系统对象。
  3. 协作式多任务:协程之间通过明确的切换点进行切换,这意味着一个协程只有在明确调用yield或其他切换函数时才会让出控制权。

协程与进程、线程的区别

  1. 进程

    • 定义:进程是操作系统分配资源和调度的基本单位,每个进程拥有独立的地址空间。
    • 并发性:多个进程可以并行执行(在多核CPU上)。
    • 开销:进程的创建和上下文切换开销较大,因为涉及操作系统的资源分配和管理。
  2. 线程

    • 定义:线程是进程内的一个执行单元,多个线程共享同一个进程的资源(如内存、文件等)。
    • 并发性:线程可以在一个进程内并发执行,同样可以在多核CPU上实现并行。
    • 开销:线程的创建和上下文切换开销较小于进程,但仍然涉及操作系统的调度。
  3. 协程

    • 定义:协程是一种在用户空间内实现的轻量级线程,它由程序显式控制调度。
    • 并发性:协程在单个线程内实现并发,不能利用多核CPU并行执行。
    • 开销:协程的创建和切换开销非常小,因为它们不依赖操作系统的调度。

举例

以下是一个简单的 Python 示例,展示了协程的基本用法:

import asyncioasync def coroutine_1():print("协程1开始")await asyncio.sleep(1)print("协程1结束")async def coroutine_2():print("协程2开始")await asyncio.sleep(2)print("协程2结束")async def main():task1 = asyncio.create_task(coroutine_1())task2 = asyncio.create_task(coroutine_2())await task1await task2asyncio.run(main())

在这个例子中,coroutine_1coroutine_2是两个协程,使用asyncio模块的await语法实现了协程的切换和调度。运行时,两个协程会在单个线程内交替执行,模拟并发的效果。

总结

协程是一种高效的并发编程模型,适用于I/O密集型任务和需要大量并发连接的场景。与进程和线程相比,协程更加轻量级,但它无法利用多核CPU的并行能力。在实际应用中,选择合适的并发模型需要根据具体的任务特点和系统资源进行权衡。


当然,有时用更直白的语言和生活中的比喻来解释协程会更容易理解。

直白解释协程

假设你在写一篇文章,同时有两个朋友分别在等你回复邮件和发信息。传统的做法是你一心一意写完文章,再去回复邮件,最后再去回信息。这就像是单线程。

协程的思路则是,你在写文章时,每隔一段时间停下来,看看有没有新的邮件需要回复,回复几句后继续写文章,再过一段时间再停下来看看信息。这种方法让你可以在一个任务(写文章)中间切换到其他任务(回复邮件、发信息),每个任务都可以分阶段完成。

协程和其他概念的区别

  • 进程:就像是你有三个不同的人(进程)分别在做这些任务,每个人都有自己的工作台和资源。
  • 线程:就像是你有三个分身(线程)同时做这些任务,分身之间共享一张工作台和资源。
  • 协程:就像是你一个人在做所有的事情,但是你能够非常高效地在这些事情之间切换,不会浪费时间。

更具体的比喻

想象一下你在看电视(主任务),但还要时不时地去厨房做饭(任务A),还有时不时地去看看小孩在做什么(任务B)。如果你是进程模式,那就是你找了三个不同的人,一个专门看电视,一个专门做饭,一个专门看小孩,各做各的,互不干涉。

如果你是线程模式,你一个人有三个分身,每个分身专注一个任务,但你们共用同一个身体,所以偶尔会有点儿碰撞和协调的问题。

而协程模式下,你一个人干这三件事,你在看电视的时候,广告时间到了,你暂停看电视,去厨房看看锅是不是开了水(任务A),再暂停做饭去看看小孩(任务B),然后再回来继续看电视。你知道什么时候该去做哪个任务,而不会造成浪费时间的切换。这就是协程高效的原因。

代码示例的解释

以刚才的 Python 代码示例为基础,可以这样理解:

import asyncioasync def coroutine_1():print("协程1开始")  # 开始写文章await asyncio.sleep(1)  # 写了一会儿,去看一下邮件print("协程1结束")  # 回来继续写文章async def coroutine_2():print("协程2开始")  # 开始做饭await asyncio.sleep(2)  # 做了一会儿,去看看小孩print("协程2结束")  # 回来继续做饭async def main():task1 = asyncio.create_task(coroutine_1())  # 开始写文章任务task2 = asyncio.create_task(coroutine_2())  # 开始做饭任务await task1  # 等待写文章任务完成await task2  # 等待做饭任务完成asyncio.run(main())

这个代码中,coroutine_1coroutine_2分别表示写文章和做饭这两个任务,通过await让出控制权去处理其他任务,就像你在广告时间去处理其他事情一样。

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

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

相关文章

嵌入式单片机软件与硬件的结合方法分析

不知道大家有没有疑惑,为什么软件能控制硬件?关于这个问题,给出直观解释的文章:本文分析STM32单片机到底是如何软硬件结合的,分析单片机程序如何编译,运行。 软硬件结合 初学者,通常有一个困惑,就是为什么软件能控制硬件?就像当年的51,为什么只要写P1=0X55,就可以…

Leetcode3212. 统计 X 和 Y 频数相等的子矩阵数量

Every day a Leetcode 题目来源:3212. 统计 X 和 Y 频数相等的子矩阵数量 解法1:二维前缀和 维护二维前缀和,分别统计 ‘X’ 和 ‘Y’ 的个数。 统计足以下条件的子矩阵数量: 包含 grid[0][0]‘X’ 和 ‘Y’ 的频数相等。至少…

贪吃蛇超精讲(C语言)

前言 如果你还是个萌新小白,那么该项目的攻克过程一定会十分艰难。虽然作者已经将文章尽可能写的逻辑清晰,内容详细。但所谓“纸上得来终觉浅”,在讲到陌生结构和函数时,大家请一定自己动手去敲一遍代码,这很重要&…

00 JavaWeb

学习资料:B站视频-黑马程序员JavaWeb基础教程 文章目录 JavaWeb1、JavaWeb简介2、 JavaWeb主要内容3、JavaWeb技术栈4、JavaWeb课程安排5、Web核心课程安排 JavaWeb 1、JavaWeb简介 Web:全球广域网,也称为万维网(www),能够通过浏…

Mysql-索引结构

一.什么是索引? 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引 二.无索引的情况 找到…

Java BitSet学习

一. 位运算 在学习 BitSet 之前,我们先看一下位运算; 下述我们拿 long 来接收位运算的返回值,我们知道 long 为 64 位,8 个字节; // 1. 右移一位,表示 num / 2;右移 6 位,表示 nu…

C++ | Leetcode C++题解之第273题整数转换英文表示

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<string> singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Ni…

DC-1靶场打靶第一次!!!!冲冲冲!

今天打了一下DC-1这个靶场&#xff0c;感觉收获比大&#xff0c;我就来记录一下。 我的思路是下面的这个 我们先把靶机导入&#xff0c;然后与我们的liunx(攻击机)在同一个网段中&#xff0c;这也大大的减低难度。 然后我们先对自己这个网段内存活的主机进行操作&#xff0c;我…

【Spring Boot】网页五子棋项目中遇到的困难及解决方法

目录 一、HikariPool-1 - Starting异常二、Invalid bound statement (not found)异常三、The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary异常四、The server time zone value时区报错异常五、补充知识点…

免费【2024】springboot 白优校园社团网站的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

Django transaction.atomic()事务处理

在Django中&#xff0c;transaction.atomic()是一个上下文管理器&#xff0c;它会自动开始一个事务&#xff0c;并在代码块执行完毕后提交事务。如果在代码块中抛出异常&#xff0c;事务将被自动回滚&#xff0c;确保数据库的一致性和完整性。 在实际应用中&#xff0c;你可能需…

PHP 表单验证:邮件和URL

PHP 表单验证&#xff1a;邮件和URL 在Web开发中&#xff0c;表单验证是一个至关重要的环节&#xff0c;它确保了用户输入的数据的有效性和安全性。特别是在处理邮件地址和URL时&#xff0c;准确的验证尤为重要。本文将详细介绍如何使用PHP来验证表单中的邮件地址和URL。 邮件…

[HTML]一文掌握

背景知识 主流浏览器 浏览器是展示和运行网页的平台&#xff0c; 常见的五大浏览器有 IE浏览器、火狐浏览器&#xff08;Firefox&#xff09;、谷歌浏览器&#xff08;Chrome&#xff09;、Safari浏览器、欧朋浏览器&#xff08;Opera&#xff09; 渲染引擎 浏览器解析代码渲…

R语言读取txt和csv只有1列时

多半是间隔符的问题 ?read.table read.table(file, header FALSE, sep "", quote "\"",dec ".", numerals c("allow.loss", "warn.loss", "no.loss"),row.names, col.names, as.is !stringsAsFacto…

Agent类型解析:AIGC在不同领域的应用与影响

目录 引言 垂直智能体&#xff08;Vertical Agent&#xff09; 水平智能体&#xff08;Horizontal Agent&#xff09; 混合智能体&#xff08;Hybrid Agent&#xff09; 结论 引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;智能体&#xff08;Agent&#xf…

Edge浏览器加载ActiveX控件

背景介绍 新版Edge浏览器也是采用Chromium内核&#xff0c;虽然没有谷歌浏览器市场占有率高&#xff0c;但是依托微软操作系统的优势&#xff0c;Edge浏览器还是发展很强劲&#xff0c;占据着市场第二的位置。随着微软停止服务IE浏览器&#xff0c;曾经风光无限的IE浏览器页退出…

如何使用javascript将商品添加到购物车?

使用JavaScript将商品添加到购物车可以通过以下步骤实现&#xff1a; 创建一个购物车对象&#xff0c;可以是一个数组或者对象&#xff0c;用于存储添加的商品信息。在网页中的商品列表或详情页面&#xff0c;为每个商品添加一个“添加到购物车”的按钮&#xff0c;并为按钮绑…

甄选范文“论企业集成平台的理解与应用”,软考高级论文,系统架构设计师论文

论文真题 企业集成平台(Enterprise Imtcgation Plaform,EIP)是支特企业信息集成的像环境,其主要功能是为企业中的数据、系统和应用等多种对象的协同行提供各种公共服务及运行时的支撑环境。企业集成平台能够根据业务模型的变化快速地进行信息系统的配置和调整,保证不同系统…

bootstrap设置表格列宽及换行

bootstrap设置表格列宽及换行 业务背景页面操作问题处理 业务背景 在日常工作过程中&#xff0c;遇到一个字段长度太长的时候&#xff0c;列表展示整个展示的话效果太差&#xff0c;比如这样的 列表展示出现了滚动条&#xff0c;查看列表内容时就不太方便&#xff1b;但是业务…

数学建模--优劣解距离法TOPSIS

目录 简介 TOPSIS法的基本步骤 延伸 优劣解距离法&#xff08;TOPSIS&#xff09;的历史发展和应用领域有哪些&#xff1f; 历史发展 应用领域 如何准确计算TOPSIS中的理想解&#xff08;PIS&#xff09;和负理想解&#xff08;NIS&#xff09;&#xff1f; TOPSIS方法在…