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

news2024/11/24 19:02:53

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

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

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

相关文章

【无标题】什么是UL9540测试,UL9540:2023版本增加哪些测试项目

什么是UL9540测试,UL9540:2023版本增加哪些测试项目 UL 9540是美国安全实验室(Underwriters Laboratories)发布的标准,名称为"UL 9540: Energy Storage Systems and Equipment",翻译为中文为"能量存储…

案例046:基于微信小程序的云上考场

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

【解决办法】Pycharm中新添加或者导入项目文件名红色!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、问题描述二、问题原因三、解决办法 一、问题描述 Pycharm的代码中添加新的文件夹,发现文件夹下的文件名是红色的,如下图: …

人、机不同在于变与多

人擅长变,如变模态、变尺度,而机器侧重多,如多模态、多尺度。 人类擅长变化的能力是由于我们的大脑和思维能力的灵活性所决定的。我们可以通过学习和适应,改变我们的态度、行为方式和观点,以适应不同的情境和环境。例如…

ORACLE使用Mybatis-plus批量插入

ORACLE使用mybatis-plus自带的iservice.saveBatch方法时,会报DML Returing cannot be batch错误: 推测原因是oracle不支持insert into table_name (,) values (,),()的写法。且oracle不会自动生…

【S32K3环境搭建】-0.2-安装S32DS product updates和 packages

目录 1 安装S32DS product updates和 packages 1.1 方法一:通过S32DS Extensions and Updates安装product updates和 packages 1.2 方法二:通过Install New Software…安装product updates和 packages 2 S32DS product updates和 packages安装后的效…

【Pytorch使用自制数据集,Dataloader】

数据集结构 话不多说,直接上核心代码 myDataset.py from collections import Counter from torch.utils.data import Dataset import os from PIL import Imageclass MyDataset(Dataset):"""读取自制的数据集args:- image_dir: 图片的地址- labe…

3.数据库

目录 一、数据库的基本信息 1.1 数据库的定义 1.2数据库的分类 1.2.1 关系型数据库 1.2.2 非关系型数据库 1.3 SQL介绍 1.3.1 概念 1.3.2 SQl语言分类 1.3.3 SQL注释 1.3.4 数据库操作命令DDL 1.3.5 数据表操作命令DDL 1.3.6 数据表操作命令DML 1.3.7 数据表中内容…

centos7-zabbix安装与使用(较全的配置)

文章目录 zabbix介绍一、zabbix是什么1.1 zabbix专用词汇1.2 zabbix程序组件 二、zabbix的优缺点三、为什么使用zabbix3.1 zabbix可以满足的监控系统需求 四、zabbix监控的生命周期 zabbix安装一、zabbix环境搭建1.1 安装wget1.2 关闭防火墙1.3 关闭SELinux 二、安装zabbix2.1 …

上传文件接口的创建_FastAPI

上传文件接口的创建 功能描述代码效果演示与注意事项 功能描述 前端用户需要上传文件至平台,就比如CSDN的上传资源部分,都是一样的功能逻辑,想要实现这个功能其实并不难。 这里以上传的JSON格式文件为例,其他格式文件的话可以自…

基本网络安全概述:保护您的数字生活

数字时代给我们的生活带来了无与伦比的连通性和便利,但也带来了新的威胁和漏洞。随着我们越来越依赖技术,网络安全概述的重要性怎么强调都不为过。在这篇文章中,我们将深入探讨网络安全的重要性、其关键组成部分、最佳实践、常见威胁以及该领…

【go语言开发】go项目打包成Docker镜像,包括Dockerfile命令介绍、goctl工具生成

本文主要介绍如何将go项目打包成镜像,首先介绍Dockerfile常用命令介绍,然后介绍使用工具goctl用于生成Dockerfile,还可以根据需求自定义指令内容,最后讲解如何将go-blog项目打包成镜像,以及如何运行等 文章目录 前言Do…

C语言结构体介绍(超详细)

文章目录 每日一言结构体是什么?为什么要使用结构体?如何使用结构体?结构体的定义结构体的声明如何访问结构体中的成员 结构体内存对齐什么是结构体内存对齐对齐规则修改默认对齐数 为什么存在结构对齐 总结结语 每日一言 Develop your imagination – you can u…

Ubuntu系统下使用apt-get安装Redis

记录一下Ubuntu20.04 64位系统下使用apt-get安装Redis 首先检查一下系统是否安装过redis whereis redismywmyw-K84HR:~$ whereis redis redis: mywmyw-K84HR:~$ 更新软件包 sudo apt-get update -y安装redis sudo apt-get install redis-server -ymywmyw-K84HR:~$ sudo apt…

【S32K3环境搭建】-0.1-安装S32 Design Studio for S32 Platform 3.5

目录(S32DS安装步骤详细) 1 安装S32 Design Studio for S32 Platform 3.5准备工作 2 下载S32 Design Studio for S32 Platform 3.5安装包 2.1 获取S32DS的License许可 3 安装S32 Design Studio for S32 Platform 3.5 4 打开S32 Design Studio for S…

DNS协议(DNS规范、DNS报文、DNS智能选路)

目录 DNS协议基本概念 DNS相关规范 DNS服务器的记录 DNS报文 DNS域名查询的两种方式 DNS工作过程 DNS智能选路 DNS协议基本概念 DNS的背景 我们知道主机通信需要依靠IP地址,但是每次通过输入对方的IP地址和对端通信不够方便,IP地址不好记忆 因此提…

备战春招——12.05算法

树、二叉树 本次主要是对树、二叉树的前中后和递归与非递归遍历以及通过这种结构完成一些操作实现。 二叉树 中序遍历 中序遍历就是中间打印出结果嘛,如下列递归实现的,中间取结果. /** 递归实现* Definition for a binary tree node.* struct TreeNode {* …

axios使用

Get请求 Post请求 出问题了: 并发请求 全局配置 多个实例如何处理 拦截器 axios在Vue中的模块封装

Pyside2 (Qt For Python)进度条功能实现

Pyside2 (Qt For Python)进度条功能实现 进度条(QProgressBar) 今天来介绍PySide2进度条(QProgressBar)的使用,如下所示: 说明 进度条也是一个常用的控件,当程序需要做一件比较耗费时间的任…

【PduR路由】PduR模块详细介绍

目录 1.PDUR模块功能介绍 2.关键概念理解 3.功能详细设计 3.1I-PDU handling 3.1.1 I-PDU Reception to upper module(s) 3.1.1.1 Communication Interface 3.1.1.2 Transport Protocol 3.1.2 I-PDU Transmission from upper module(s) 3.1.2.1 Multicast 3.1.2.2 Co…