社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python自动化运维之高级函数

马哥Linux运维 • 7 年前 • 819 次点击  

一、协程


1.1协程的概念

协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。(其实并没有说明白~)

那么这么来理解协程比较容易: 

线程是系统级别的,它们是由操作系统调度;协程是程序级别的,由程序员根据需要自己调度。我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序,这就是协程。也就是说同一线程下的一段代码执行着执行着就可以中断,然后跳去执行另一段代码,当再次回来执行代码块的时候,接着从之前中断的地方开始执行。

比较专业的理解是:

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。

1.2 协程的优缺点

协程的优点:

  1. 无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)

  2. 无需原子操作锁定及同步的开销

  3. 方便切换控制流,简化编程模型

  4. 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

协程的缺点:

  1. 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。

  2. 进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序

2.1 yield实现协程

前文所述“子程序(函数)在执行过程中可以中断去执行别的子程序;别的子程序也可以中断回来继续执行之前的子程序”,那么很容易想到Python的yield,显然yield是可以实现这种切换的。

执行结果:

由执行结果可以证明g现在就是生成器函数。

2.2 协程函数赋值过程

用的是yield的表达式形式,要先运行next(),让函数初始化并停在yield,然后再send() ,send会在触发下一次代码的执行时,给yield赋值
next()和send() 都是让函数在上次暂停的位置继续运行,

执行结果:

需要注意的是每次都需要先运行next()函数,让程序停留在yield位置。
如果有多个这样的函数都需要执行next()函数,让程序停留在yield位置。为了防止忘记初始化next操作,需要用到装饰器来解决此问题

执行结果:

2,3 协程函数简单应用

请给Tom投喂食物

执行结果:

2.4 协程函数的应用

实现linux中"grep -rl error "命令,过滤一个文件下的子文件、字文件夹的内容中的相应的内容的功能程序。

首先了解一个OS模块中的walk方法,能够把参数中的路径下的文件夹打开并返回一个元组:

返回的是一个元组,第一个元素是文件的路径,第二个是文件夹,第三个是该路径下的文件

这里需要用到一个写程序的思想:面向过程编程

二、面向过程编程


面向过程:核心是过程二字,过程及即解决问题的步骤,基于面向过程设计程序就是一条工业流水线,是一种机械式的思维方式。流水线式的编程思想,在设计程序时,需要把整个流程设计出来

优点:

1:体系结构更加清晰

2:简化程序的复杂度

缺点:

可扩展性极其的差,所以说面向过程的应用场景是:不需要经常变化的软件,如:linux内核,httpd,git等软件

下面就根据面向过程的思想完成协程函数应用中的功能

目录结构:

程序流程

第一阶段:找到所有文件的绝对路径

第二阶段:打开文件

第三阶段:循环读取每一行

第四阶段:过滤“error”

第五阶段:打印该行属于的文件名

第一阶段:找到所有文件的绝对路径

g是一个生成器,就能够用next()执行,每次next就是运行一次,这里的运行结果是依次打开文件的路径

我们在打开文件的时候需要找到文件的绝对路径,现在可以通过字符串拼接的方法把第一部分和第三部分进行拼接

用循环打开:

结果:

将查询出来的文件和路径进行拼接,拼接成绝对路径

执行结果:

用函数实现:

为了把结果返回给下一流程

第二阶段:打开文件

第三阶段:循环读出每一行内容

第四阶段:过滤

第五阶段:打印该行属于的文件名

执行结果:

作者:炫维

来源:http://xuanwei.blog.51cto.com/11489734/1953449



————广告时间————

《马哥Linux云计算及架构师》课程,由知名Linux布道师马哥创立,经历了8年的发展,联合阿里巴巴、唯品会、大众点评、腾讯、陆金所等大型互联网一线公司的马哥课程团队的工程师进行深度定制开发,课程采用 Centos7.2系统教学,加入了大量实战案例,授课案例均来自于一线的技术案例。

开课时间:11月06号

课程咨询请长按即可咨询


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/6XNoZ5cMDm
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/3233
 
819 次点击