|
Python异步编程异步编程异步编程是一种编程范式,通过非阻塞的方式执行任务,允许程序在等待某些操作(如I/O操作、网络请求、数据库查询等)完成时,继续执行其他任务。这与同步编程(或阻塞编程)形成对比,后者在等待操作完成时会阻塞执行流程,直到任务完成才继续执行。以下是异步编程的一些关键概念和特点:非阻塞执行:在异步编程中,当一个任务需要等待某些操作完成时(例如等待网络请求的响应),程序不会停止执行其他任务,而是会继续处理其他任务。回调函数:异步编程经常使用回调函数,在等待操作完成后,这些回调函数会被执行,以处理操作的结果。回调函数允许程序在任务完成后继续执行相应的代码。Promise和Future:许多异步编程模型使用Promise或Future对象来表示将来某个时间点会完成的操作结果。Promise和Future提供了一种管理异步操作结果的方法,允许在结果可用时执行相应的代码。协程:协程是异步编程中常用的一种构造,允许函数在等待操作完成时暂停执行,并在操作完成后恢复执行。Python中的async和await关键字用于定义和控制协程。事件循环:异步编程依赖于事件循环来管理和调度异步任务。事件循环会不断检查和执行已完成的任务,并在任务完成后触发相应的回调或恢复协程的执行。说明:异步并不简单的等于并发,更精准的表述应该是并发,也即多个任务在同一时间段内交替运行,而不是同时运行。asyncio模块asyncio模块是用来编写并发代码的库,使用async/await语法。asyncio模块最大特点就是,只存在一个线程,与JavaScript中的async/await一样。asyncio模块在单线程上启动一个事件循环(eventloop),时刻监听着新进入循环的事件,对事件进行处理,并不断地重复这个过程,直到异步任务结束。asyncio模块示例代码示例importasyncioasyncdefcount():print("Start")awaitasyncio.sleep(1)print("End")asyncdefmain():#gather()函数的作用是收集,能够按照协程的执行顺序保存对应协程的执行结果。awaitasyncio.gather(count(),count(),count())#run()通常用于脚本或应用程序的入口点,用于启动异步操作。asyncio.run(main())12345678910111213执行示例也即,异步操作能够在单线程的情况下,对协程依次执行,遇到阻塞的情况就会等待去执行下一个协程,并对协程的执行结果进行收集。FastApi框架FastApi是一个用于构建API的现代、快速(高性能)的web框架,使用Python并基于标准的Python类型提示。FastApi能够支持异步编程的async/await语法。如下是一个简单的代码示例,用户点餐,提供了可乐和汉堡,在制作汉堡的同时,餐厅人员也在制作可乐,而不是等待汉堡完成后再去制作可乐,如下是这个过程的模拟。importasynciofromfastapiimportFastAPIfromdatetimeimportdatetimeapp=FastAPI()asyncdefget_coca(number:int):start=datetime.now().strftime("%Y-%m-%d%H:%M:%S")awaitasyncio.sleep(number)end=datetime.now().strftime("%Y-%m-%d%H:%M:%S")return{"coca":number,"start":start,"end":end}asyncdefget_burgers(number:int):start=datetime.now().strftime("%Y-%m-%d%H:%M:%S")awaitasyncio.sleep(number)end=datetime.now().strftime("%Y-%m-%d%H:%M:%S")return{"burgers":number,"start":start,"end":end}#路由地址定义@app.get("/orders")asyncdefread_orders(burgers:int=0,coca:int=0,consumer:str=""):#这里收集协程的处理结果result=awaitasyncio.gather(get_burgers(burgers),get_coca(coca))return{"consumer":consumer,"order":result}123456789101112131415161718192021222324252627接口测试结果:如上就是Python异步编程的简单示例,主要是相关概念以及模块的使用介绍,如果有需要可以查询asyncio模块的官方文档,或者是FastAPI的官方文档,尤其是FastAPI官网关于async/await的章节使用汉堡做了详细的讲述。参考资料:[1]并发async/awaithttps://fastapi.tiangolo.com/zh/async/#_4[2]Python异步编程入门https://www.ruanyifeng.com/blog/2019/11/python-asyncio.html[3]asyncio官方文档https://docs.python.org/3/library/asyncio.html
|
|