1.协程

协程不是计算机提供的,计算机只提供:进程、线程。协程时人工创造的一种用户态切换的微进程,使用一个线程去来回切换多个进程

实现协程的几种方法

  • greenlet:早期模块
  • yield关键字:可以保存代码,保存状态
  • asyncio装饰器(3.4)
  • async、await关键字(3.5)【推荐】

1.1greenlet实现协程

pip install greenlet

from greenlet import greenlet
def fun1():
gre2.switch()#切换到fun2
pass
def fun2():
gre1.switch()#切换到fun1
pass
gre1 = greenlet(func1)
gre2 = greenlet(func2)
gre1.switch()#先去执行fun1

1.2yield关键字实现协程

def func1():
yield 1
yield from func2()
yield 2 def func2():
yield 3
yield 4
f1 = func1()
for item in f1:
print(item,end=" ") #打印结果
1 3 4 2

1.3使用asyncio模块实现协程

再python3.4版本之后才可以用(不用安装,在标准库中)

import asyncio
#使用该装饰器装饰后,该函数就是一个协程函数
@asyncio.coroutine
def func1():
print(1)
#遇到IO操作时,会自动切换到taks中的其他任务函数
yield from asyncio.sleep(2)
print(2) @asyncio.coroutine
def func2():
print(3)
yield from asyncio.sleep(2)
print(4) #将两个协程函数封装成一个tasks列表
tasks = [
asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
]
#
loop = asyncio.get_event_loop()
loop.run_until_complete(func1())

1.4async & await关键字实现协程

import asyncio
#使用该装饰器装饰后,该函数就是一个协程函数 async def func1():
print(1)
#遇到IO操作时,会自动切换到tasks中的其他任务函数
await asyncio.sleep(2)
print(2) async def func2():
print(3)
await asyncio.sleep(2)
print(4) #将两个协程函数封装成一个tasks列表
tasks = [
asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
] loop = asyncio.get_event_loop()
loop.run_until_complete(tasks)

2.协程意义

在线程中如果遇到IO等待时间,线程不会傻等着,会利用空闲的时间去做其他事情,也就是进程异步执行。

#协程请求资源使用第三方库aiohttp
import aiohttp

3.异步编程

3.1时间循环

理解成一个死循环,去检测并执行某些代码

#伪代码
任务列表 = [task1,task2...]
while True:
for 就绪任务 in 可执行任务列表:
执行
for 已完成任务 in 已完成任务列表:
从任务列表中删除 import asyncio #生成一个书简循环
loop = asyncio.get_event_loop()
#将任务放到任务列表中
loop.run_until_complete(任务)

3.2案例

协程函数,

定义函数的时候,用async def 函数名

协程对象:执行协程函数的时候得到一个协程对象

async def func():
pass
result = func()

注意:执行协程函数时得到的协程对象,函数内部代码不会执行

import asyncio
async def func():
print("哈喽") f = func()#协程对象 loop = asyncio.get_event_loop()#创建循环对象
loop.run_until_complete(f)#通过循环对象执行协程对象 #python3.7可以直接
asyncio.run(f)

3.3await关键字

await + 可等待的对象 {协程对象,Future对象,Task对象} (类似于I O 等待)

import asyncio
async def func():
print("哈喽")
re = await asyncio.sleep(2)
print(re)
asyncio.run(func())

await就是等待对象的值得到结果后再继续向下执行

import asyncio
async def other():
print("start")
await asyncio.sleep(2)
print("end")
return 1 async def fun():
print("执行协程函数内部代码")
#遇到IO操作时会挂起当前协程任务,等IO操作完成后再继续往下执行,当前协程挂起时,时间循环对象可以执行其他协程任务
re = await other()
print("IO请求结束,结果为:",re) asyncio.run(func()) #执行结果
执行协程函数内部代码
start
end
IO请求结束,结果为: 1

python协程详细解释以及例子的更多相关文章

  1. Python 协程总结

    Python 协程总结 理解 协程,又称为微线程,看上去像是子程序,但是它和子程序又不太一样,它在执行的过程中,可以在中断当前的子程序后去执行别的子程序,再返回来执行之前的子程序,但是它的相关信息还是 ...

  2. day-5 python协程与I/O编程深入浅出

    基于python编程语言环境,重新学习了一遍操作系统IO编程基本知识,同时也学习了什么是协程,通过实际编程,了解进程+协程的优势. 一.python协程编程实现 1.  什么是协程(以下内容来自维基百 ...

  3. 终结python协程----从yield到actor模型的实现

    把应用程序的代码分为多个代码块,正常情况代码自上而下顺序执行.如果代码块A运行过程中,能够切换执行代码块B,又能够从代码块B再切换回去继续执行代码块A,这就实现了协程 我们知道线程的调度(线程上下文切 ...

  4. 5分钟完全掌握Python协程

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 1. 协程相关的概念 1.1 进程和线程 进程(Process)是应用程序启动的实例,拥有代码.数据 ...

  5. 初学Python——协程

    进程.线程和协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程. 在linux系统中,线程就是轻量级的进程,而我们 ...

  6. 从yield 到yield from再到python协程

    yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...

  7. 用yield实现python协程

    刚刚介绍了pythonyield关键字,趁热打铁,现在来了解一下yield实现协程. 引用官方的说法: 与线程相比,协程更轻量.一个python线程大概占用8M内存,而一个协程只占用1KB不到内存.协 ...

  8. [转载] Python协程从零开始到放弃

    Python协程从零开始到放弃 Web安全 作者:美丽联合安全MLSRC   2017-10-09  3,973   Author: lightless@Meili-inc Date: 2017100 ...

  9. 00.用 yield 实现 Python 协程

    来源:Python与数据分析 链接: https://mp.weixin.qq.com/s/GrU6C-x4K0WBNPYNJBCrMw 什么是协程 引用官方的说法: 协程是一种用户态的轻量级线程,协 ...

  10. python协程详解

    目录 python协程详解 一.什么是协程 二.了解协程的过程 1.yield工作原理 2.预激协程的装饰器 3.终止协程和异常处理 4.让协程返回值 5.yield from的使用 6.yield ...

随机推荐

  1. b站——沐神——深度学习

    预备知识 数据操作 MXNet nd:(array函数:得到NDArray) [[1. 1. 1.] [1. 1. 1.]] <NDArray 2x3 @cpu(0)> np:(asnum ...

  2. linux资源查看与监控命令

  3. 解决LayUI中的 laydate 点击一闪而过问题

    加一个:trigger: 'click' <input name="apbegin" id="apbegin" class="layui-inp ...

  4. 12.14linux学习第十七天

    今天老刘收了下第13章尾巴,讲了第14章和第15章. 13.6 分离解析技术 现在,喜欢看我们这本<Linux就该这么学>的海外读者越来越多,如果继续把本书配套的网站服务器(https:/ ...

  5. element的el-table使用模板插槽在火狐和IE无法显示tooltip(浏览器兼容)

    el-table中使用show-overflow-tooltip属性,配合tooltip出现的浏览器兼容性问题 el-table中使用show-overflow-tooltip属性内容过长被隐藏时显示 ...

  6. Pytorch基础复习

    项目推进中期,重新到头来学Pytorch.five落泪了.(╬▔皿▔)凸 笑死,憋不住了,边更边学. 整篇博客整体采用总分总形式.首先将介绍内容(加黑部分)之间关系进行概括,后拆解,最后以图总结. 全 ...

  7. 什么是5G垂直行业?

    什么是垂直行业呢? 感觉"垂直行业"这个词在太多地方遇到,但是这个词的涵盖范围到底是什么呢? 垂直这一概念源于两条直线(或平面)的直角交叉,两条直线是相互作为参照物的.比如,我们可 ...

  8. MybatisX无法自动生成entity实体类

    在做项目的时候,安装MybatisX插件可以让我们不用写实体类,加快我们的开发速度,让我们更专注于业务逻辑的开发,可是最近在做项目的时候,发现MybatisX插件的MybatisX-Generator ...

  9. nginx配置反向代理服务器,实现在https网站中请求http资源

    网站使用nginx作为服务器,协议从http升级为https的注意事项. 具体升级步骤请点击搜索 1.首先,修改宝塔面板配置 选择配置文件,http请求重定向为https.所有80端口请求都重定向为h ...

  10. SQL注入,Hacker入侵数据是如何做到的

    什么是SQL注入? SQL注入就是未将代码与数据进行严格的隔离,导致在读取用户数据的时候,错误地把黑客注入的数据作为代码的一部分执行. SQL注入自诞生以来以其巨大的杀伤力闻名. 例子: 典型的SQL ...