python是一门解释性语言,在python编程中,我们定义了几个运行过程,A - B - C ,解释器按照顺序执行,A - B - C 然后执行完毕。但是程序的运行需要花费时间,再看上面的例子 ,假如A函数要运行 3s B函数要运行5s C函数要运行7s 现在计算运行时间 3+5+7为15s的运行时间。这时候我们会发现程序在A函数的时候,即使计算机还有资源,但是控制权并没有给B函数,导致B函数在A函数运行完成的时候才能正常运行,然后是C,这远远浪费了计算机的资源和时间。于是我们使用了协程,这是在python的官网中也非常推荐的实方法
——asyncio 模块
优点:优于多线程切换花费的资源,方便简化控制流,支持高并发编程。
缺点:不支持多线程,只能配合多进程使用。
python实现协程的方式有
1.yield 方式

def run(n=0):#定义一个生成器函数while True:n = yield nprint('传入数值,开始执行')
a = run()    #预激活状态
print(next(a))
print('*'*20)
print(a.send('传入一个值'))

看一下运行结果

0
********************
传入数值,开始执行
传入一个值

生成器函数在激活之后生成一个n 然后通过send()函数传入数据。在每次取出值的时候函数run都会在yield执行完之后停顿,等待下一次执行(下一次执行时在yield之后开始),主程序此时开始执行其他操作,实际上这就是一种协程序。
2.asyncio 模块
定义:

import asyncioasync def run_async():print('这是一个协程!')
#协程对象 并没有执行
coroutine = run_async()
#创建一个时间循环
loop = asyncio.get_event_loop()
#运行协程
loop.run_until_complete(coroutine)

看一下运行结果

这是一个协程!  #运行成功了

协程本身是不能直接运行的,必须通过run_until_complete帮协程包装成task任务对象,task任务是Future类的子类,所以其它协程可以等待任务完成,或当这些任务完成获取返回结果。

task实例:

mport asyncioasync def run_async():print('这是一个协程!')
#协程对象 并没有执行
coroutine = run_async()
#创建一个时间循环
loop = asyncio.get_event_loop()
#创建task事件
task = loop.create_task(coroutine)
#把task事件注册到事件循环中,并运行
loop.run_until_complete(task)

运行结果:

这是一个协程!    #运行成功

获取返回值
task任务在运行完成的时候,可以保存程序的运行结果,然后可以用该对象获取返回值。

async def run_async():print('这是一个协程!')return '协程运行的返回值!'#协程对象 并没有执行
coroutine = run_async()
#创建一个时间循环
loop = asyncio.get_event_loop()
#创建task事件
task = loop.create_task(coroutine)
#把task事件注册到事件循环中,并运行
loop.run_until_complete(task)
#在运行完成的时候task保留程序运行的返回值,我们用task.result()获取返回值
print(task.result())

结果:

这是一个协程!
协程运行的返回值!

await 方法阻塞

import asyncioasync def run_async():print('这是一个协程!')await asyncio.sleep(3)             #在这里我们用await 方法模拟程序运行阻塞时间return '协程运行的返回值!'#协程对象 并没有执行
coroutine = run_async()
#创建一个时间循环
loop = asyncio.get_event_loop()
#创建task事件
task = loop.create_task(coroutine)
#把task事件注册到事件循环中,并运行
loop.run_until_complete(task)
#获取返回值
print(task.result())

结果:

这是一个协程!##手动一下在三秒之后
协程运行的返回值!

并发并行
实例:假设我们有两件事要做,第一件是烧水,第二件是做饭。

import time
import asynciostart_time = time.time()       #开始时间
def heat_water():print('现在去烧水了!,用时2s')time.sleep(2)    #时间停滞2s
def cook():print('现在去做饭了!,用时3s')time.sleep(3)     #时间停滞3sheat_water()
cook()end_time = time.time()    #结束时间
run_time = end_time - start_time    #计算
print('两件事一共用时%s'%run_time)

看一下运行结果

现在去烧水了!,用时2s
现在去做饭了!,用时3s
两件事一共用时5.001287221908569

我们会发现在程序一件一件去做的时候一共要花费的时间为 2+3
再看看协程

import time
import asynciostart_time = time.time()
async def heat_water():print('现在去烧水!要花费2s,烧水的时间可以去做饭!')await asyncio.sleep(2)print('水烧完了!')async def cook():print('把烧水搁置,现在去做饭!要花费3s')await asyncio.sleep(3)print('饭做好了!')loop = asyncio.get_event_loop()    #创建一个时间循环 loop#把两个事件保存到task中
task = {heat_water(),cook()
}
loop.run_until_complete(asyncio.wait(task))     #asyncio.wait()方法实现并发
end_time = time.time()
run_time = end_time -start_time
print('做这两件事情的时间为:%s'%run_time)

运行结果

把烧水搁置,现在去做饭!要花费3s
现在去烧水!要花费2s,烧水的时间可以去做饭!
水烧完了!
饭做好了!
做这两件事情的时间为:3.0039124488830566

我们从这里可以看出来,两个事情一起做时间并不是3+2 而是cook时间3s,这样就是协程的优势所在。
——每一份梦想都应该被尊重
——每一次努力都会有回报
——加油吧少年

协程:协程的创建和使用。相关推荐

  1. 【Kotlin 协程】协程启动 ⑥ ( 协程生命周期状态 | 新创建 New | 活跃 Active | 完成中 Completing | 已完成 Completed | 取消中 | 已取消 )

    文章目录 一.协程标识 Job 实例对象 二.协程生命周期状态 三.协程生命周期状态改变 一.协程标识 Job 实例对象 通过 launch 或 async 协程构建器 函数 创建 协程 , 会返回 ...

  2. 进程 线程 协程_进程 线程 协程 管程 纤程 概念对比理解

    不知道是不是我自己本身就有那么一丝丝的密集恐惧,把这么一大堆看起来很相似很相关的概念放在一起,看起来是有点麻,捋一捋感觉舒服多了. 相关概念 任务.作业(Job,Task,Schedule) 在进程的 ...

  3. Windows 纤程/协程

    Windows下 纤程/协程 理论知识,立足根本 使用须知 代码 写这篇文章的原因是,很多框架/库都有协程/纤程的支持,比如python的gevent,PHP 的swoole等等,但是具体是什么样的呢 ...

  4. linux多线程编程和linux 2.6下的nptl,Linux多線程編程和Linux 2.6下的NPTL

    這幾天由於工作需要,琢磨了一下Linux下的多線程的相關資料.Linux下最常用的多線程支持庫為Pthread庫,它是glibc庫的組成部分.但是關於Pthread的說明文檔非常缺乏,特別是對POSI ...

  5. 请注意了!你的APP可能有下架风险,途牛同程携程等多款App登黑榜!

    不知道大家是否还记得,去年闹得沸沸扬扬的FaceBook泄漏用户隐私的案子,不清楚的呢?就再带你们吃吃这个瓜.事情是这样的,美国联邦贸易委员会(FTC)在2018年爆料,特朗普在竞选总统期间,聘请的咨 ...

  6. 纤程 java_JAVA协程 纤程 与Quasar 框架

    ava使用的是系统级线程,也就是说,每次调用new Thread(....).run(),都会在系统层面建立一个新的线程,然鹅新建线程的开销是很大的(每个线程默认情况下会占用1MB的内存空间,当然你愿 ...

  7. 抽丝剥茧聊Kotlin协程之协程与线程之间的区别

    1. 前言 关于协程,可能大家最经常听到的一句话就是"协程是轻量级的线程".一脸懵逼,有没有?这可是官方的slogan,严格意义上讲,一方面官方是想让大家把协程和线程产生一个直观关 ...

  8. Kotlin协程 - - - 协程的简单使用

    一.协程介绍 1.简介 协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码.协程是在版本 1.3 中添加到 Kotlin 的,它基于来自其他语言的既定概念. 在 And ...

  9. Python协程之协程在手,说走就走

    协程在手,说走就走 什么是协程 先介绍–生产者-消费者模式 解释如下 生产者消费者模式并不是GOF提出的23种设计模式之一,23种设计模式都是建立在面向对象的基础之上的,但其实面向过程的编程中也有很多 ...

  10. BNUZ程协技术部2020寒假任务简单版(后端)

    文章目录 前言 1 检查密码 题目 代码 改进 2 输出学生成绩 题目 代码 3 图形类继承 题目 代码 4 动物园 题目 代码 5 简易版通讯录 题目 代码 前言 这只是我还没系统学java时写的代 ...

最新文章

  1. PowerShell让系统可以执行.ps1文件
  2. 【题解】SDOI2008莎拉公主的困惑
  3. Async Solr Queries in Python
  4. oppok1刷原生android10,OPPOK1系统升级最新ColorOSV6刷机包(完整固件rom下载ColorOSV6安卓9.0)...
  5. Vim 编辑器底端 [noeol], [dos] 的含义
  6. DNS服务器配置详解
  7. 《超实用的HTML代码段》阅读笔记1——HTML5自动聚焦
  8. linux getopt_long函数,新手疑问:getopt_long()重入问题
  9. php 人民币换算美金,美元汇率换算_美国人民币换算器
  10. 【LaTeX】公式书写工具 | LaTeX转MathML(Word适用)| 公式截图转LaTeX| LaTeX学习(偏公式输入方面)
  11. 【Uplift】因果推断基础篇
  12. 【IoT】5.Business Strategy 商业战略
  13. 黑鲨怎么修改服务器,黑鲨自定义安装系统教程图解
  14. VBA-循环语句之Do...Loop
  15. 解析二分查找时间复杂度
  16. android系统方法裁剪图片 华为手机显示为圆
  17. jquery UI 隐藏关闭按钮
  18. WIN10 LTSC 2019 安装新版Mircosoft Edge浏览器,解决无法安装问题
  19. MATLAB | 绘制复指数函数 y = exp(j*w*n)的三维图像
  20. stm32 SWD调试接口的使用

热门文章

  1. 简历解析步骤(第二步)技术与实现(9)博客/主页地址
  2. 拼团小程序服务器配置,拼团小程序的拼团活动怎么设置?
  3. 为android系统添加USB AUDIO设备的放音和录音功能(转载)
  4. 解决uniapp的checkBox取消选中
  5. bert做文本摘要_Fine-tune BERT for Summarization: BERT和文本摘要
  6. JavaWeb~模板引擎Thymeleaf总结
  7. 如何使用jquery刷新当前页面
  8. java使用POI的HSSFWorkbook导出excel模板添加各种校验
  9. Sunday 算法详解
  10. char (*)[]无法传给参数char **