首页 > 其他分享 >第一章 协程

第一章 协程

时间:2024-08-27 21:03:30浏览次数:10  
标签:func2 func1 协程 yield 第一章 print def asyncio

协程 & asyncio & 异步编程的 > 背景

为什么要学?

  • 越来越多的学生都来问async异步相关问题,并且这一部分的知识点不太容易学习(异步非阻塞、asyncio)
  • 异步相关话题和框架越来越多,例如:tornado、fastapi、django 3.x asgi 、aiohttp都在异步 -> 提升性能。

如何讲解?

  • 第一部分:协程。
  • 第二部分:asyncio模块进行异步编程。
  • 第三部分:实战案例。

1.协程

协程不是计算机提供,程序员人为创造。

协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。例如:

def func1():
	print(1)
    ...
	print(2)
	
def func2():
	print(3)
    ...
	print(4)

func1()
func2()

实现协程有这么几种方法:

  • greenlet,早期模块。
  • yield关键字。
  • asyncio装饰器(py3.4)
  • async、await关键字(py3.5)【推荐】

1.1 greenlet实现协程

pip3 install greenlet
from greenlet import greenlet


def func1():
    print(1)        # 第1步:输出 1
    gr2.switch()    # 第3步:切换到 func2 函数
    print(2)        # 第6步:输出 2
    gr2.switch()    # 第7步:切换到 func2 函数,从上一次执行的位置继续向后执行


def func2():
    print(3)        # 第4步:输出 3
    gr1.switch()    # 第5步:切换到 func1 函数,从上一次执行的位置继续向后执行
    print(4)        # 第8步:输出 4


gr1 = greenlet(func1)
gr2 = greenlet(func2)

gr1.switch() # 第1步:去执行 func1 函数

1.2 yield关键字

def func1():
    yield 1
    yield from func2()
    yield 2


def func2():
    yield 3
    yield 4


f1 = func1()
for item in f1:
    print(item)

1.3 asyncio

在python3.4及之后的版本。

import asyncio

@asyncio.coroutine
def func1():
    print(1)
    # 网络IO请求:下载一张图片
    yield from asyncio.sleep(2)  # 遇到IO耗时操作,自动化切换到tasks中的其他任务
    print(2)


@asyncio.coroutine
def func2():
    print(3)
    # 网络IO请求:下载一张图片
    yield from asyncio.sleep(2) # 遇到IO耗时操作,自动化切换到tasks中的其他任务
    print(4)


tasks = [
    asyncio.ensure_future( func1() ),
    asyncio.ensure_future( func2() )
]

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

注意:遇到IO阻塞自动切换

1.4 async & await关键字

在python3.5及之后的版本。

import asyncio

async def func1():
    print(1)
    # 网络IO请求:下载一张图片
    await asyncio.sleep(2)  # 遇到IO耗时操作,自动化切换到tasks中的其他任务
    print(2)


async def func2():
    print(3)
    # 网络IO请求:下载一张图片
    await asyncio.sleep(2) # 遇到IO耗时操作,自动化切换到tasks中的其他任务
    print(4)


tasks = [
    asyncio.ensure_future( func1() ),
    asyncio.ensure_future( func2() )
]

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

标签:func2,func1,协程,yield,第一章,print,def,asyncio
From: https://www.cnblogs.com/Tmars/p/18383537

相关文章

  • 周志华机器学习西瓜书学习笔记(一)| 第一章 绪论
    1.引言    机器学习(machinelearning,ML)是一门研究如何通过计算的手段,利用经验来改善系统自身性能的学科。由于在计算机系统中,“经验”通常以数据形式储存,因此,机器学习研究的主要内容,是关于在计算机上从数据中产生模型(model)的算法,称作“学习算法”*(learningalgorith......
  • 计算机网络笔记分享(第一章 概述)
    计算机网络的定义:若干节点(结点)和连接这些节点(结点)的链路构成网络一些互相连接的自治的计算机的集合通用的、可编程的硬件互连而成网络的功能:连通性、共享(信息、硬件、软件)三个概念:网络:许多计算机连接在一起;互连网:许多网络通过路由器连接在一起;互联网(因特网):全球最大的......
  • 第一章:Linux‘’用户和组的管理‘’
    第一章:Linux‘’用户和组的管理‘’@一、Linux用户身份概述@1.1 Linux用户介绍@1.2 三个重要passwd,shadow,group文件的介绍@1.2.1 passwd文件@1.2.2 shadow文件@1.2.3 group文件@二、创建Linux用户@2.1 添加Linux用户——[email protected] 设置Linux用户......
  • 第一章:Linux‘’用户和组的管理‘’
    第一章:Linux‘’用户和组的管理‘’@一、Linux用户身份概述@1.1 Linux用户介绍@1.2 三个重要passwd,shadow,group文件的介绍@1.2.1 passwd文件@1.2.2 shadow文件@1.2.3 group文件@二、创建Linux用户@2.1 添加Linux用户——[email protected] 设置Linux用户......
  • 第一章:Linux‘’用户和组的管理‘’
    第一章:Linux‘’用户和组的管理‘’@一、Linux用户身份概述@1.1 Linux用户介绍@1.2 三个重要passwd,shadow,group文件的介绍@1.2.1 passwd文件@1.2.2 shadow文件@1.2.3 group文件@二、创建Linux用户@2.1 添加Linux用户——[email protected] 设置Linux用户......
  • 【北京迅为】itop-龙芯2k1000 sylixos 嵌入式实时系统烧写手册-第一章与第二章 详细步
      第一章准备与说明1.1文档说明l该文档适用于龙芯2K1000开发板;l用于实现无根文件系统的SylixOS硬盘固化自启动;l包含根文件系统的导出说明。1.2准备工作l1台有以太网口的电脑,1条网线、1条串口线;lTFTP功能:电脑需要安装“RealEvo-IDE”或者“Tftp32”软件......
  • IEC61850教程,第一章:IEC 61850 基础知识介绍
    第一章:IEC61850基础知识介绍平时学习标准或调试IEC61850设备,需要IEC61850模拟器,推荐一款:客户端下载地址:IEC61850客户端模拟器服务端下载地址:IEC61850服务端模拟器什么是IEC61850?IEC61850是定义变电站自动化系统内的设备及其相互作用方式的国际标准。IEC61850的目......
  • lua协程实现异步编程模式
    异步编程模式只是一个代码结构,c#中的async/await的写法就是异步编程模式,这边就是通过协程来达到和async/await类似的效果。 异步编程模式写法1:资源分帧加载这边运行环境用的是:Unity+xLua lua脚本:Assets/Lua/Test9.lua.txtlocal_Time=CS.UnityEngine.Timelocalfunct......
  • 【机器学习】西瓜书第一章 绪论
    参考资料:[1]周志华.机器学习[M].清华大学出版社,2016.一、引言我们生活中存在许多基于经验做出的判断,比如月明星稀,那第二天可能会是好天气;一个西瓜敲起来声音响,色泽也不错,大概率是一个好瓜。我们做出这样判断的原因是我们观察到了很多月明星稀之后的好天气,吃到了很多符合......
  • 第一章 redis简单介绍
    一、引言在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技......