【协程】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)本文来自博客园,作者:郭祺迦,转载请注明原文链接:https://www.cnblogs.com/guojie-guojie/p/16330249.html

浙公网安备 33010602011771号