【Python零基础入门篇 · 24】:协程和IO操作的简单理解、greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结

简介: 【Python零基础入门篇 · 24】:协程和IO操作的简单理解、greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结

一、协程和IO操作的简单理解


1、协程的理解


协程,又称微线程,纤程。英文名Coroutine。


协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。


通俗的理解: 在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。


适用场景:如果一个线程里面IO操作(网络等待、文件操作)比较多,协程就比较适用,适用于高并发处理。


2、简单实现协程

d516cc65fd244eeb8c5693955ead3c8e.png


3、IO操作的简单理解


IO就是input/output,也就是输入和输出。


常见的IO操作:文件操作、网络等待




二、greenlet协程模块的使用


greenlet:是一个用C实现的协程模块,通过switch()来实现任务函数间的切换。


greenlet属于手动切换任务,当遇到IO操作,程序会阻塞,而不能进行自动切换。


greenlet为第三方库模块,需要在Terminal中输入下载命令:pip install greenlet


1、通过greenlet实现任务切换


导入模块:from greenlet import greenlet


实例化协程对象:greenlet(任务名)


下图代码逻辑


代码执行到g1.switch()时转换到eat()函数中运行,当执行到g2.switch()时任务切换到study()函数中运行

8dec099da231409ebe1803903eed35e0.png



三、gevent模块的使用


原理是当一个greenlet遇到IO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。 由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。


gevent遇到IO操作,会进行自动切换,属于主动式切换。在gevent中用到的主要模式是greenlet


1、grevent的使用


  • gevent.spawn(函数名)——创建协程对象


  • join()——阻塞,等待某个协程执行完毕


  • joinall(参数)——参数是一个协程对象列表,会等待所有的协程都执行完毕再退出



2、gevent模块中自带了sleep耗时函数


执行A/B两个任务,当A、B遇到耗时操作,gevent会让A继续执行,同时也开始执行B任务。


A完成了耗时操作后,B在对应的时间也完成了耗时操作。


c4d0e98a553e46a78a6edfb13a66de1a.png


3、joinall()的使用


9a5d1cbe86a24724aa5eec717751cf87.png


四、程序打补丁


猴子补丁功能:拥有在模块运行时的替换能力


  • 导入模块:from gevent import monkey

532e197e3e134f7d9e4a0d679000c34c.png


五、总结



1、进程是资源分配的基本单位,线程是CPU调度的基本单位。


2、对比

  • 进程:切换需要的资源较大,效率低


  • 线程:切换需要的资源一般,效率一般


  • 协程:切换需要的资源很小,效率高


多线程适合IO密集型操作(读写数据操作多的)


多进程适合CPU密集型操作(科学计算、对视频进行高清解码等)


相关文章
|
21小时前
|
Linux Python Windows
打包Python程序文件:pyinstaller实现
本文介绍基于Python语言中的pyinstaller模块,将写好的.py格式的Python代码及其所用到的所有第三方库打包,生成.exe格式的可执行文件,从而方便地在其他环境、其他电脑中直接执行这一可执行文件的方法。
|
1天前
|
消息中间件 安全 调度
基于Python的性能优化(线程、协程、进程)
一、多线程 在CPU不密集、IO密集的任务下,多线程可以一定程度的提升运行效率。
|
1天前
|
数据采集 JSON 数据库
800个程序实例、5万行代码!清华大学出版【Python王者归来】
Python 的丰富模块(module)以及广泛的应用范围,使 Python 成为当下最重要的计算机语言之一,本书尝试将所有常用模块与应用分门别类组织起来,相信只要读者遵循本书实例,定可以轻松学会 Python 语法与应用,逐步向 Python 高手之路迈进,这也是撰写本书的目的。 本书以约 800 个程序实例讲解了:完整的 Python 语法,Python 的输入与输出,Python 的数据型态,列表(list)、元组(tuple)、字典(dict)、集合(set),函数设计,类别设计,使用系统与外部模块(module),设计自己的模块(module),文件压缩与解压缩,程序除错与异常处理…
|
2天前
|
存储 Java 编译器
Java文件IO操作基础
Java文件IO操作基础
5 0
|
2天前
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版操作报错之在执行任务时遇到了一个IO错误,具体表现为无法从本地主机(localhost)下载文件,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4天前
|
数据库连接 Python
如何提高python程序代码的健壮性
在编程的时候,我们难免会遇到一些不可靠的情况,比如网络请求失败,数据库连接超时等等。这些不确定性会让我们的程序容易出现各种错误和异常。那么如何来增加程序的容错性和健壮性呢? 可能大多数人会想到使用try except来进行异常捕捉进行失败重试(Retry)。虽然try-escept一个非常常见和有效的方式来增强程序稳定性,但是可能一不小心就会造成栈溢出。 所以接下来我就来介绍一个另外的一个专门用于失败重试的库:retrying。
|
4天前
|
存储 算法 Python
Python编程作业一:程序基本流程
Python编程作业一:程序基本流程
12 0
|
5天前
|
网络协议 Python
在python中利用TCP协议编写简单网络通信程序,要求服务器端和客户端进行信息互传。 - 蓝易云
在这个示例中,服务器端创建一个socket并监听本地的12345端口。当客户端连接后,服务器发送一条欢迎消息,然后关闭连接。客户端创建一个socket,连接到服务器,接收消息,然后关闭连接。
58 0
|
5天前
|
数据采集 安全 数据挖掘
2024年最新7 年 Python 的我,总结了这 90 条写 Python 程序的建议,上海大厂Python面试经历
2024年最新7 年 Python 的我,总结了这 90 条写 Python 程序的建议,上海大厂Python面试经历
2024年最新7 年 Python 的我,总结了这 90 条写 Python 程序的建议,上海大厂Python面试经历
|
5天前
|
Python
2024年最新【Python】程序的组织结构:顺序结构,2024年最新46道面试题带你了解中高级Python面试
2024年最新【Python】程序的组织结构:顺序结构,2024年最新46道面试题带你了解中高级Python面试
2024年最新【Python】程序的组织结构:顺序结构,2024年最新46道面试题带你了解中高级Python面试