简单了解python协程的相关知识


Posted in Python onAugust 31, 2019

什么是协程

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

通俗的理解: 一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量,然后切换到另一个函数中运行,并且切换的次数以及社么时候再切换回来是可控的

协程和线程的差异

在实现多任务时,线程会自己欢子一些数据,操作系统切换时需要恢复数据,所以线程恢复比较耗性能

协程底层原理(举例)

'''
1,协程的实现原理,底层通过 yield 实现
'''
def work1(): #工作任务
  for i in range(10):
    print('work1----{}'.format(i))
    yield i
def work2():
  for i in range(10):
    print('work2----{}'.format(i))
    yield i
def work3():
  for i in range(10):
    print('work3----{}'.format(i))
    yield i
g1 = work1()
g2 = work2()
g3 = work3()
while True: #循环调用生成器实现任务切换
  try:
    print(next(g1))
    print(next(g2))
    print(next(g3))
  except StopIteration :
    pass
    break

协程 greenlet

python -m pip install greenlet

示例

'''
1,展示greenelent ,不能自动切换需要手动切换
'''
import greenlet
def work1():
  for i in range(10):
     print('work1----{}'.format(i))
     g2.switch()  #切换到g2
def work2():
  for i in range(10):
     print('work2----{}'.format(i))
     g1.switch() #切换到g1
g1 = greenlet.greenlet(work1) #返回协程对象
g2 = greenlet.greenlet(work2)
g1.switch() #启动开关

执行顺序

简单了解python协程的相关知识

gevent

greenlet 已经实现了协程,但是还是人工切换,gevent 提供了自动切换功能,其原理是执行过程中遇到IO操作,自动切换

'''
协程gevent IO操作会切换
'''
import gevent
def work1(): # 工作任务
  for i in range(10):
    print('work1----{}'.format(i))
    gevent.sleep(0.5)
def work2():
  for i in range(10):
    print('work2----{}'.format(i))
    gevent.sleep(0.5)
g1 = gevent.spawn(work1) #指定工作函数
g2 = gevent.spawn(work2) #指定工作函数
g1.join()  #等待协程执行完成再往下走
g2.join()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在centos7中分布式部署pyspider
May 03 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
Numpy掩码式数组详解
Apr 17 Python
python删除不需要的python文件方法
Apr 24 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
Django Rest framework权限的详细用法
Jul 25 Python
Python turtle画图库&&画姓名实例
Jan 19 Python
如何在Windows中安装多个python解释器
Jun 16 Python
Django实现微信小程序支付的示例代码
Sep 03 Python
OpenCV绘制圆端矩形的示例代码
Aug 30 Python
详解Python中__new__方法的作用
Mar 31 Python
利用rest framework搭建Django API过程解析
Aug 31 #Python
Python进度条的制作代码实例
Aug 31 #Python
python类的实例化问题解决
Aug 31 #Python
python检测服务器端口代码实例
Aug 31 #Python
python实现多线程端口扫描
Aug 31 #Python
python实现复制大量文件功能
Aug 31 #Python
django 做 migrate 时 表已存在的处理方法
Aug 31 #Python
You might like
资料注册后发信小技巧
2006/10/09 PHP
简单的用PHP编写的导航条程序
2006/10/09 PHP
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
php 404错误页面实现代码
2009/06/22 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
vue实现扫码功能
2020/01/17 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
python清除字符串里非字母字符的方法
2015/07/02 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
python 接收处理外带的参数方法
2018/12/03 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
css3实现一个div设置多张背景图片及background-image属性实例演示
2017/08/10 HTML / CSS
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
社团成立邀请函
2014/01/08 职场文书
医院总经理岗位职责
2014/02/04 职场文书
财务简历的自我评价
2014/03/05 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android