简单了解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 相关文章推荐
python 字符串split的用法分享
Mar 23 Python
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 Python
python通过socket实现多个连接并实现ssh功能详解
Nov 08 Python
Python中正则表达式的用法总结
Feb 22 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
Dec 09 Python
YUV转为jpg图像的实现
Dec 09 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
Python 如何实现数据库表结构同步
Sep 29 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 Python
Python机器学习之KNN近邻算法
May 14 Python
Python必备技巧之字符数据操作详解
Mar 23 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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
php 表单数据的获取代码
2009/03/10 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
php多进程应用场景实例详解
2019/07/22 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
jquery each的几种常用的使用方法示例
2014/01/21 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
Python的argparse库使用详解
2018/10/09 Python
对Python中内置异常层次结构详解
2018/10/18 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
pandas 像SQL一样使用WHERE IN查询条件说明
2020/06/05 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
神龙架导游词
2015/02/11 职场文书
实习介绍信范文
2015/05/05 职场文书
仰望星空观后感
2015/06/10 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android
python 使用pandas读取csv文件的方法
2022/12/24 Python