Python 协程Coroutine

 定义

协程,又称微线程,纤程。英文名Coroutine。通过 async/await 语法进行声明。需要 Python 3.7+

特点

协程的特点在于是一个线程执行,可以处理IO密集型程序的效率问题,但是处理CPU密集型不是它的长处,如要充分发挥CPU利用率可以结合多进程+协程。

 优势

最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

协程运行入口点:asyncio.run(coro, *, debug=False)

一:功能

  1. 用来运行最高层级的入口点 "main()" 函数。
  2. 此函数会运行传入的协程,负责管理 asyncio 事件循环,终结异步生成器,并关闭线程池。
  3. 当有其他 asyncio 事件循环在同一线程中运行时,此函数不能被调用。
  4. 如果 debug 为 True,事件循环将以调试模式运行。
  5. 此函数总是会创建一个新的事件循环并在结束时关闭之。它应当被用作 asyncio 程序的主入口点,理想情况下应当只被调用一次。

挂起任务:coroutine asyncio.sleep(delay, result=None)

一:功能

挂起当前任务,以允许其他任务运行。

delay:阻塞指定的秒数。

如果指定了 result,则当协程完成时将其返回给调用者。

sleep() 总是会

将 delay 设为 0 将提供一个经优化的路径以允许其他任务运行。 这可供长期间运行的函数使用以避免在函数调用的全过程中阻塞事件循环。

 二:参数说明

  1. delay:阻塞指定的秒数。将 delay 设为 0 将提供一个经优化的路径以允许其他任务运行。 这可供长期间运行的函数使用以避免在函数调用的全过程中阻塞事件循环。
  2. result:如果指定了 result,则当协程完成时将其返回给调用者。

 三:示例

import asyncio

async def main():
     print('hello')
     # 把asyncio.sleep(1)看成是一个耗时1秒的IO操作,在此期间,主线程并未等待,
     # 而是去执行EventLoop中其他可以执行的coroutine了,因此可以实现并发执行。
     await asyncio.sleep(1)
     print('world')

# 运行协程main()
asyncio.run(main())

# Expected output:
# hello
# world

创建任务:asyncio.create_task(coro, *, name=None)

一:功能

用来并发运行作为 asyncio 任务的多个协程。

将 coro 协程封装为一个 Task 并调度其执行。返回 Task 对象。

二:参数说明

name 不为 None,它将使用 Task.set_name() 来设为任务的名称。

三:示例

import asyncio
import time

async def say_after(delay, what):
    print(what + f" started at {time.time()}")
    await asyncio.sleep(delay)
    print(what)

async def main():
    task1 = asyncio.create_task(
        say_after(1, 'hello'))

    task2 = asyncio.create_task(
        say_after(2, 'world'))

    print(f"started at {time.strftime('%X')}")

    # Wait until both tasks are completed (should take
    # around 2 seconds.)
    await task1
    await task2

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

# Output
"""
started at 17:14:32
hello started at 1635823295.3259559
world started at 1635823295.3259559
hello
world
finished at 17:14:34
"""

并发运行任务:asyncio.gather()

awaitable asyncio.gather(*aws, return_exceptions=False)

一:功能

  1. 并发运行 aws 序列中的可等待对象。
  2. 如果 aws 中的某个可等待对象为协程,它将自动被作为一个任务调度。
  3. 如果所有可等待对象都成功完成,结果将是一个由所有返回值聚合而成的列表。结果值的顺序与 aws 中可等待对象的顺序一致。

示例如下:

import asyncio
import time


async def cor(name):
    print(f'{name} start at {time.time()}')
    await asyncio.sleep(4)
    print(f'{name} end at {time.time()}')
    return name


async def main():
    try:
        print(f"started at {time.strftime('%X')}")
        task1 = asyncio.create_task(cor('task1'))
        task2 = asyncio.create_task(cor('task2'))
        task
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值