简单了解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脚本
Feb 10 Python
使用Python脚本和ADB命令实现卸载App
Feb 10 Python
pygame实现弹力球及其变速效果
Jul 03 Python
django定期执行任务(实例讲解)
Nov 03 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
让Django支持Sql Server作后端数据库的方法
May 29 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 Python
Selenium自动化测试工具使用方法汇总
Jun 12 Python
如何利用python读取micaps文件详解
Oct 18 Python
Python如何使用循环结构和分支结构
Apr 13 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抽象工厂模式(Elgg)
2010/03/21 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
php.ini中date.timezone设置分析
2011/07/29 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
go和python调用其它程序并得到程序输出
2014/02/10 Python
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
生产总经理岗位职责
2013/12/19 职场文书
仓管员岗位责任制
2014/02/19 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
晚会主持词开场白
2014/03/17 职场文书
党员政治学习材料
2014/05/14 职场文书
教师节感谢信
2015/01/22 职场文书
离婚协议书怎么写
2015/01/26 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL