Python中的Asyncio库是用于异步编程的标准库,可以优化程序性能和效率。其中Asyncio.task是Asyncio重要组成部分,它负责任务调度和协程管理。以下是Asyncio.task常用函数的详解:
asyncio.task常用函数
asyncio.ensure_future(coro_or_future, *, loop=None)
将协程或者Future对象转化成一个Task对象,如果传入的已经是一个Task对象,则原样返回
asyncio.gather(*coros_or_futures, loop=None, return_exceptions=False):
等待多个协程或者Future对象全部完成,如果全部完成,则将每个协程返回的结果包装成list返回,如果设置了return_exceptions为True,则有异常也按照顺序返回一个列表
以下是示例:
import asyncio
async def coro1():
await asyncio.sleep(1)
return 1
async def coro2():
await asyncio.sleep(2)
return 2
async def main():
result = await asyncio.gather(coro1(), coro2(), loop=asyncio.get_event_loop())
print(result)
asyncio.run(main())
输出结果为:[1, 2]
asyncio.wait(tasks, *, loop=None, timeout=None, return_when=ALL_COMPLETED):
等待传入的任务(task)完成,tasks可以是Future对象、Task对象或者协程。如果所有任务都完成,则返回一个集合(set),其中包含每个任务的状态(state)、结果(result)和异常(exception)。如果设置了timeout,则在指定的时间内返回结果,不管任务是否完成。return_when参数用于指定何时函数应该返回,默认为ALL_COMPLETED,意味着当所有的任务都完成时才返回。
以下是示例:
import asyncio
async def coro1():
await asyncio.sleep(1)
print("coro1 finished")
async def coro2():
await asyncio.sleep(2)
print("coro2 finished")
async def main():
tasks = [asyncio.create_task(coro1()), asyncio.create_task(coro2())]
done, pending = await asyncio.wait(tasks, timeout=1)
# done集合中包含已完成的任务,pending集合中包含未完成的任务
print(f'done={done}, pending={pending}')
# 此时输出 done=set(), pending={<Task coro1() running>, <Task coro2() running>}
# 因为两个协程都没有在timeout时间内执行完
done, pending = await asyncio.wait(tasks, timeout=3)
print(f'done={done}, pending={pending}')
# 此时输出 done={<Task coro2() finished>}, pending={<Task coro1() finished>}
# 两个协程都执行完了,因此都在done集合中
# 注意:done集合是集合(set),顺序是不确定的
asyncio.run(main())
输出结果为:
coro1 finished
coro2 finished
done=set(), pending={<Task coro1() running>, <Task coro2() running>}
coro1 finished
coro2 finished
done={<Task coro2() finished>}, pending={<Task coro1() finished>}
以上就是Asyncio.task常用函数的常见操作示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Asyncio库之asyncio.task常用函数详解 - Python技术站