【协程】5、task对象

  • 白话:在事件循环中添加多个任务
  • Tasks用于并发调度协程,通过asyncio.create_task(协程对象)的方式创建Task对象,这样可以让协程加入事件循环中等待被调度执行处理使用async.create_task()函数以外,还可以用低层级的loop.create_task()或ensure_future()函数,不建议手动实例化Task对象。
  • 注意:asyncio.create_task()函数在python3.7中被加入。在python3.7之前,可以改用低层级的asyncio.ensure_future()函数
  • 示例1:
import asyncio


async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return '返回值'


async def main():
    print('main开始')

    # 创建Task对象,将当前执行func函数任务添加到事件循环中
    task1 = asyncio.ensure_future(func())
    # 创建Task对象,将当前执行func函数任务添加到事件循环中
    task2 = asyncio.ensure_future(func())
    print('main结束')

    # 当执行某协程遇到IO操作时,会自动化切换执行其他任务
    # 此处await是等待相对应的协程全部执行完毕并获取结果
    ret1 = await task1
    ret2 = await task2

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
  • 上面的案例,在日常开发中很少这么写,基本写法如下:
# -*- coding: utf-8 -*-
import asyncio

async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return '返回值'


async def main():
    print('main开始')
    # python3.6的写法
    tasks = [
        asyncio.ensure_future(func()),
        asyncio.ensure_future(func())
    ]
    """
    # python3.7的写法[可以对task进行命名操作]
    tasks = [
    	asyncio.create_task(func(), name='n1'),
        asyncio.create_task(func(), name='n2')
    ]
    """
    print('main结束')

    done, pending = await asyncio.wait(tasks)
    print(done)

# python3.6的写法
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

"""
# python3.7及以上的写法
asyncio.run(main())
"""
示例3:
async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return '返回值'


tasks = [
    asyncio.ensure_future(func()),
    asyncio.ensure_future(func())
]

loop = asyncio.get_event_loop()

done, pending = loop.run_until_complete(asyncio.wait(tasks))
print(done)
posted @ 2022-05-31 14:06  郭祺迦  阅读(119)  评论(0)    收藏  举报