简单了解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基础教程之python消息摘要算法使用示例
Feb 10 Python
python删除列表内容
Aug 04 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 Python
让Django支持Sql Server作后端数据库的方法
May 29 Python
python版飞机大战代码分享
Nov 20 Python
Django使用AJAX调用自己写的API接口的方法
Mar 06 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 Python
python 模块导入问题汇总
Feb 01 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文件下载实例代码浅析
2016/08/17 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
信息滚动效果的实例讲解
2017/09/18 Javascript
vue filters的使用详解
2018/06/11 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
python冒泡排序算法的实现代码
2013/11/21 Python
Python实现的RSS阅读器实例
2015/07/25 Python
简单理解Python中的装饰器
2015/07/31 Python
python交互式图形编程实例(一)
2017/11/17 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
使用python模拟高斯分布例子
2019/12/09 Python
Python箱型图处理离群点的例子
2019/12/09 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
优秀党支部书记事迹材料
2014/05/29 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
2014年双拥工作总结
2014/11/21 职场文书
前台文员岗位职责
2015/02/04 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
公司总经理岗位职责
2015/04/01 职场文书