asyncio 是用来编写 并发 代码的库,使用 async/await 语法
官方文档
https://docs.python.org/zh-cn/3.10/library/asyncio.html
https://docs.python.org/zh-cn/3.10/library/asyncio-task.html
asyncio-API 文档
https://docs.python.org/zh-cn/3.10/library/asyncio-api-index.html
loop低层Api文档
https://docs.python.org/zh-cn/3.10/library/asyncio-llapi-index.html
csdn
https://blog.csdn.net/qq_43380180/article/details/111573642
import asyncio
async def main():
print('hello')
await asyncio.sleep(1)
print('world')
asyncio.run(main())
执行 coroutine coro 并返回结果
asyncio.run(main())
task1=asyncio.create_task(main1())
task2=asyncio.create_task(main2())
await task1 #等待1运行完成,在1内io等待期task2同时运行
await task2 #等待2运行完成
asyncio.gather(*aws, return_exceptions=False)
async def main():
L = await asyncio.gather(fun1("A", 2), fun2("B", 3), fun3("C", 4) )
print(L)
asyncio.run(main())
https://docs.python.org/zh-cn/3.10/library/asyncio-eventloop.html#asyncio.loop.run_until_complete
#低层以事件循环方式调用
loop.run_forever() #运行事件循环直到 stop() 被调用。
loop.run_until_complete(future) #运行直到 future ( Future 的实例 ) 被完成
#wait() 简单等待,在超时发生时不会取消可等待对象,3.11版更改了少用这个函数
task = asyncio.create_task(foo())
done, pending = await asyncio.wait()
try: #等待对象完成,指定 timeout 秒数后超时
await asyncio.wait_for(fun(), timeout=1.0)
except asyncio.TimeoutError:
print('timeout!') #如果发生超时,任务将取消并引发 asyncio.TimeoutError.
asyncio.as_completed(aws, *, timeout=None) #并发地运行可迭代对象中的 可等待对象。 返回一个协程的迭代器
跨线程调度
asyncio.run_coroutine_threadsafe(coro, loop) #向指定事件循环提交一个协程
await asyncio.sleep(delay) #协程延时
asyncio.current_task(loop=None) #返回当前运行的 Task 实例,如果没有正在运行的任务则返回 None
asyncio.all_tasks(loop=None) #返回事件循环所运行的未完成的 Task 对象的集合。
asyncio.to_thread(func, /, args, **kwargs) #在不同的线程中异步地运行函数 func
向此函数提供的任何 args 和 **kwargs 会被直接传给 func。 并且,当前 contextvars.Context 会被传播,允许在不同的线程中访问来自事件循环的上下文变量。
Future 是一种特殊的 低层级 可等待对象,表示一个异步操作的 最终结果。
一个与 Future 类似 的对象,可运行 Python 协程。非线程安全
asyncio.Task 从 Future 继承了其除 Future.set_result() 和 Future.set_exception() 以外的所有 API。
https://docs.python.org/zh-cn/3.10/library/asyncio-task.html#task-object
asyncio.create_task() #创建 Task 对象 #也可用低层级的 loop.create_task()
*不建议手动实例化 Task 对象
cancel() 要取消一个正在运行的 Task 对象
cancelled() 可被用来检测 Task 对象是否被取消
done() 如果 Task 对象 已完成 则返回 True。
result() 返回 Task 的结果。
exception() 返回 Task 对象的异常。