【python】进阶--->并发编程之协程

一、协程

是另外一种实现多任务的方式,只不过比线程占用更小的执行单元(需要的资源).因为它自带cpu上下文,就可以在合适的时机,从一个协程切换到另一个协程.
(任务数量多于cpu时)系统在很短的时间内,将cpu轮流分配给不同的任务执行,造成了多任务同时运行的错觉.而每个任务在运行前,cpu需要知道任务从哪里开始加载,又从哪里开始运行.所以说,系统需要事先帮它设置好cpu寄存器和程序计数器.
cpu寄存器 : 是cpu内置的容量很小,但是速度极快的内存.
程序计数器 : 存储cpu正在执行的指令位置,即将执行的下一条指令的位置.
保存下来的上下文,会存储在系统中,并在任务重新调度执行再次加载进来,就能够保证任务还在原来的状态不受影响.

在这里插入图片描述

greenlet(pip install greenlet)
协程.switch(value)可以切换到指定的协程.

在这里插入图片描述

当创建一个greenlet的时候,首先会初始化一个空的栈,switch到这个栈时,会运行在greenlet构造时传入的函数(首先会打印12),如果在这个函数(test1)中switch到了另外的协程(到test2中打印56),那么这个协程会被挂起,等待再起通过switch切换回来执行.

gevent(pip install gevent)
greenlet已经实现了协程,但是需要人工切换,python还有个更强大的能够实现自动切换任务的模块:gevent.
gevent是一个并发框架,以协程greenlet为核心,其中有monkey类,将基于python线程直接转换成greenlet.
当一个协程遇到io操作(访问网络/睡眠等待),就会自动切换到其他的greenlet,等到io操作完成,再适当的时机切换回来继续执行.

在这里插入图片描述
在本文的最后呢,我附上了本节所学知识的全部代码,供大家参考,哪里有不对的地方随时在评论区指正哦~

# 协程的简单创建--->yield
import time# def test1():
#     while True:
#         print('test1---')
#         yield
#         time.sleep(0.5)
#
#
# def test2():
#     while True:
#         print('test2---')
#         yield '返回值'
#         time.sleep(0.5)# if __name__ == '__main__':
#     t1 = test1()
#     t2 = test2()
#     while True:
#         next(t1)
#         r = next(t2)
#         print(r)# greenlet
# from greenlet import greenlet
# def test1():
#     print(12)
#     g2.switch()
#     print(34)
#     g2.switch()
#
# def test2():
#     print(56)
#     g1.switch()
#     print(78)
#
# g1 = greenlet(test1)
# g2 = greenlet(test2)
# g1.switch()# gevent
# import gevent
# def test1():
#     for i in range(5):
#         print('test1---', i)
#         gevent.sleep(0)  # 阻塞,运行时能自动切换函数
#
# def test2():
#     for i in range(5):
#         print('test2---', i)
#         gevent.sleep(0)
#
#
# t1 = gevent.spawn(test1)
# t2 = gevent.spawn(test2)
# gevent.joinall([t1, t2])# gevent
from gevent import monkey;monkey.patch_all()
import gevent
import requests
from datetime import datetimedef func(url):print('time:%s, get:%s' % (datetime.now(), url))re = requests.get(url)# print('time:%s, 从%s获取数据大小:%s' % (datetime.now(), url,#                                  len(re.text)))print(re.text)func('https://www.baidu.com/')# gevent.joinall([
#     gevent.spawn(func, 'https://www.baidu.com/'),
#     gevent.spawn(func, 'https://www.python.org/'),
#     gevent.spawn(func, 'https://www.github.com/'),
# ])

关于Python协程的介绍今天就到这里啦,后续我会为大家介绍网络编程的相关知识哦~
关注我,带你领略Python的风采~😍😍😍

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

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

相关文章

1.CentOS7网络配置

CentOS7网络配置 查看网络配置信息 ip addr 或者 ifconfig 修改网卡配置信息 vim /etc/sysconfig/network-scripts/ifcfg-ens192 设备类型:TYPEEthernet地址分配模式:BOOTPROTOstatic网卡名称:NAMEens192是否启动:ONBOOTye…

暴雨AI服务器:推动大模型算力底座发展

语言大模型作为人工智能领域的重要分支,其强大的自然语言处理能力和模仿人类的对话决策能力,正逐渐成为人们的关注焦点。近日,据央视新闻报道,工业和信息化部赛迪研究院数据显示,今年我国语言大模型市场规模实现较快提…

最新鸿蒙HarmonyOS 使用Progress、Toggle开发一个接单界面

Progress 进度条组件,用于显示内容加载或操作处理等进度。 接口 Progress(options: {value: number, total?: number, type?: ProgressType}) Toggle组件提供勾选框样式、状态按钮样式及开关样式。 接口 Toggle(options: { type: ToggleType, isOn?: boolean …

oracle vm virtualBox虚拟机网卡设置

一、桥接模式 1、桥接模式自动分配IP 通过dns自动分配Ip方式、重启服务器可能会出现IP变动的情况。 选中虚拟机--设置--网络,链接方式选择“桥接网卡”,界面名称选择“需要桥接的网卡名称” 不清楚的可以在宿主机网络设置查看(需要桥接哪…

【每日一题】【12.20】2828.判别首字母缩略词

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.题目链接 2828. 判别首字母缩略词https://leetcode.cn/problems/check-if-a-string-is-an-acronym-of-words/ 2.题目描述 今天…

MySQL——表的增删查改

目录 一.Create(创建) 1.单行数据 全列插入 2.多行数据 指定列插入 3.插入否则更新 4. 替换 二.Retrieve(读取) 1. select 列 查询 2.where 条件 3.结果排序 4.筛选分页结果 三.Update (修改)…

Python实现多元线性回归模型信用卡客户价值预测项目源码+数据+项目设计报告

多元线性回归——信用卡客户价值预测 一、背景 这里以信用卡客户的客户价值为例来解释客户价值预测的具体含义: 客户价值预测就是指预测客户在未来一段时间内能带来多少利润,其利润可能来自信用卡的年费、取现手续费、分期手续费、境外交易手续费等。分…

三、万语始于HelloWorld,万物基于点灯之瑞萨RX23E-A 3线RTD PT100测温

一、概述/目的 二、RX23E-APT100三线制 2.1 资料来源 2.2 接线图 2.3 工程配置AFE24ΔΣADCPGA 2.4 代码 2.5 IIR数字滤波器 三、方案对比 三、万语始于HelloWorld,万物基于点灯之瑞萨RX23E-A 3线RTD PT100测温 一、概述/目的 介绍工业过程控制…

DAPLink源码固件编译与制作

DAPLink源码固件编译与制作 ✨这里以Air/stm32f103cbt6固件编译为例。📌DAPLink源码地址:https://github.com/ARMmbed/DAPLink🔖 如果不想自己生成,可以使用合宙提供的现成的工程以及固件;https://gitee.com/openLuat/…

官方指定Jmeter配置JVM堆内存方式

1.概述 在使用Jmeter做性能测试过程中,可能会应为默认设置的堆内存值较小出现堆内存溢出问题,此时解决的方式有两种,分布式测试和调大堆内存。下面介绍官方推荐调整堆内存方法。 2.调整Jmeter堆内存 2.1.介绍官方推荐堆内存调整方法(jmete…

mysql原理--连接的原理

1.连接简介 1.1.连接的本质 为了故事的顺利发展,我们先建立两个简单的表并给它们填充一点数据: mysql> CREATE TABLE t1 (m1 int, n1 char(1)); mysql> CREATE TABLE t2 (m2 int, n2 char(1)); mysql> INSERT INTO t1 VALUES(1, a), (2, b), (…

攻防世界-web-ics07

1. 题目描述 工控云管理系统项目管理页面解析漏洞 打开链接,是这样的一个界面 我们点击项目管理 可以看到,这里有一个查询界面,还有个view-source的链接,我们点击下view-source,可以看到这里面共有三段php代码 第一段…

在Spring Cloud中使用Zuul网关实现一个案例

本篇依旧是在Spring Cloud系列的博主已经搭建的Spring Cloud微服务模块上进行的,注意,本文依旧适合初学者和或者在Spring Cloud框架了解不是很深入的基础的开发者,本系列说不上有多高大上,博主坚持通过简单的案例,让开…

嵌入式中GPIO的工作原理-面试工作必会技能

GPIO工作方式 1、4种输入模式 输入浮空输入上拉输入下拉模拟输入 如下图为GPIO的基本结构,它主要由4部分组成,其中我们所看到的的最右边的I/O引脚,也就是芯片外接可看到的引脚,其它的部分都是GPIO内部的结构。 ①保护二极管 保护…

【新版HI3559AV100开发注意事项(二)】

#新版HI3559AV100开发注意事项(二) 十一、请问海思HI3559AV100 SPC030资料里面的HI3559ADMEB_VER_C_PCB.pcb是用什么软件打开啊? 答:PADS VX 2.2 Altium designer 十二、hi3559级联问题请教 在SDK的文档中只看到了两块Hi3559板…

服务器数据恢复-EMC存储raid5磁盘物理故障离线的数据恢复案例

服务器数据恢复环境&故障: 一台emc某型号存储服务器,存储服务器上组建了一组raid5磁盘阵列,阵列中有两块磁盘作为热备盘使用。存储服务器在运行过程中有两块磁盘出现故障离线,但是只有一块热备盘激活,最终导致该ra…

【️如何理解Java中的多态】

✅如何理解Java中的多态? ✅理解Java中的多态 ✅ 扩展知识仓✅方法的重载✅方法的重写✅重载和重写的区别区分 ✅理解Java中的多态 多态的概念比较简单,就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。 如果…

Java 中的内部类的定义

目录 一、成员内部类 二、静态内部类 三、局部内部类 四、匿名内部类 一、成员内部类 public class InnerClass {String name;private Integer age;static String hobby;/*** 成员内部类* 1、成员内部类中只能定义非静态属性和方法* 2、成员内部类中可以访问外部类的成员&a…

vue3表格导入导出.xlsx

在这次使用时恰好整出来了,希望大家也能学习到,特此分享出来 使用前确保安装以下模块,最好全局配置element-plus ### 展示一下 ### ###导出选项 ### ###导入de数据 ### 安装的模块 npm install js-table2excel // 安装js-table2excel n…

自动化测试工具选择指南

随着软件开发周期的不断缩短和需求的增加,自动化测试变得愈发重要。然而,选择适合项目的自动化测试工具并非易事。以下是一些指导原则,帮助你在众多自动化测试工具中做出明智的选择。 1. 项目需求分析 在选择自动化测试工具之前,首…