Python-Asyncio异步编程

1、协程以及协程的定义"""协程: 协程在计算机中不是真实存在的,不是计算提供的 而是程序员人为创造的 是一个用户态上下文切换,或者一个微线程 简而言之,就是通过一个线程来实现代码之间的相互切换实现协程的几种方法 greenlet,早期的模块 通过yield关键字来实现 python3 的内置模块 asyncio 通过 async 关键子 (p3.5),最主流的协程的意义: 当遇到io阻塞时,会自动切换到另一个任务,而不
摘要由CSDN通过智能技术生成

1、协程

"""
协程:
    协程在计算机中不是真实存在的,不是计算提供的
    而是程序员人为创造的
    是一个用户态上下文切换,或者一个微线程
    简而言之,就是通过一个线程来实现代码之间的相互切换

实现协程的几种方法
    greenlet,早期的模块
    通过yield关键字来实现
    python3 的内置模块 asyncio
    通过 async 关键子 (p3.5),最主流的

协程的意义:
    当遇到io阻塞时,会自动切换到另一个任务,而不是一直在原来的地方等待
    提高了程序的执行效率
"""
def fun1(): pass


def func2(): pass


fun1()
func2()
# 一般来说,先执行func1,然后执行func2
# 但是协程可以在两者之间相互切换

2、asyncio里面的事件循环

"""
异步编程,
事件循环,就是一个死循环
这一个死循环会检测并且实行某些代码
有一个任务列表,在每一次循环的时候都会检测事件的状态
如果事件为可执行,
那么这个事件就会放到可执行列表(pending)
然后遍历可执行代码
如果执行完成了,那么就会放到完成事件的列表
之后遍历其中任务,或者以其他的方式处理(full filled)
"""

3、快速上手一个异步编程

import asyncio


async def func1():
    print(1)
    # 模拟网络请求,例如下载一张图片
    await asyncio.sleep(2)
    print(2)


async def func2():
    print(3)
    await asyncio.sleep(1)
    print(4)


# 创建任务
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]

# 创建事件循环对象,或者说生成、获取一个事件循环
loop = asyncio.get_event_loop()
# 将任务放到事件循环列表,然后去检测这些任务的状态
loop.run_until_complete(asyncio.wait(tasks))

# ---> 1, 3, 4, 2

4、协程函数和协程对象,以及运行方法

"""
协程函数,
定义函数的时候通过
async def function(): pass 定义的函数

协程对象:
执行 '协程函数()' 得到的返回的结果
result = function()
注意:执行协程函数内部的协程对象代码是不会执行的,只是生成一个协程对象而已

必须要添加到事件循环中才可以执行
"""
import asyncio


# 定义一个协程函数
async def func():
    print('11111')


# 创建一个协程对象,此时内部的代码是不会执行的
result = func()

# 第一种运行方法
"""
# 通过这种方法运行会的到一个警告:
# 说获取不到事件循环对象,但是代码可以执行

loop = asyncio.get_event_loop()

loop.run_until_complete(result)
"""

# 第二种运行方法
"""
# 创建一个新事件循环对象loop
loop = asyncio.new_event_loop()

# 将事件循环对象设置到asyncio中
asyncio.set_event_loop(loop)

# 将协程对象添加到事件循环loop 中
loop.run_until_complete(result)
"""

# 第三种运行方法
# 本质上是对第二种运行方法的一种封装,让代码更加简单
asyncio.run(result)

5、await关键字

"""
await: (async wait),就是等,有了结果才继续往下执行
后面必须要跟着可等待的对象
内部可以有多个await对象
python中的可等待对象(可以理解为io等待)
    1、协程对象 async def function()
    2、Future对象
    3、Task对象
"""

import asyncio


async def fun():
    print('hello world')
    # 假设此时此刻发送了一个网络请求, res 表示网络请求的结果
    res = await asyncio.sleep(2)
    print('结束', res)


asyncio.run(fun())

print('主循环退出')

# hello world
# 结束 None
# 主循环退出
""&#
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值