在本文中,我们展示了如何在Python中使用async/await关键字。
通过异步编程,我们可以在主程序执行的同时执行任务。async和await关键字简化了Python中的异步编程。Python在语言中内置了异步编程模型。
Python协程
协程是一种用于协作式多任务处理的Python函数,它们可以在其中暂停和恢复。使用asyncdef
语法声明协程。
async/await关键字
async/await
关键字在Python3.7中被标准化。它们简化了Python中的异步编程。async
关键字用于创建Python协程。await
关键字暂停协程的执行,直到它完成并返回结果数据。await关键字仅在异步函数中有效。
Python异步/等待示例I
下面是一个使用async/await
关键字的简单程序。
#!/usr/bin/python import asyncio async def mul(x, y): return x * y loop = asyncio.get_event_loop() res = loop.run_until_complete(mul(5, 5)) print(res2) loop.close()
程序创建并运行一个异步函数。
async def mul(x, y): return x * y
协程是使用async
修饰符声明的函数。
loop = asyncio.get_event_loop()
get_event_loop
返回一个异步事件循环。需要一个事件循环来执行异步代码。
res = loop.run_until_complete(mul(5, 5))
run_until_complete
函数运行事件循环,直到future完成。它返回未来的结果,或引发其异常。Future表示异步操作的最终结果。
Python异步/等待示例二
使用asyncio.run
,我们简化了代码。该函数创建一个事件循环,调度协程,最后关闭循环。
#!/usr/bin/python import asyncio async def add(x, y): return x + y async def get_results(): res1 = await add(3, 4) res2 = await add(8, 5) print(res1, res2) asyncio.run(get_results())
在示例中,我们运行两个异步函数。
$ python simple2.py 7 13
Python异步/等待示例三
Gathering是安排多个协程同时运行的便捷方式。我们使用asyncio.gather
收集协程。
使用asyncio.sleep
,我们创建了一个在指定秒数内完成的协程。它通常用于模拟长时间运行的任务。
#!/usr/bin/python import asyncio import time import random async def task1(): wait = random.randint(0, 3) await asyncio.sleep(wait) print("task 1 finished") async def task2(): wait = random.randint(0, 3) await asyncio.sleep(wait) print("task 2 finished") async def task3(): wait = random.randint(0, 3) await asyncio.sleep(wait) print("task 3 finished") async def main(): for x in range(2): await asyncio.gather(task1(), task2(), task3()) time.sleep(1) print('----------------------------') t1 = time.perf_counter() asyncio.run(main()) t2 = time.perf_counter() print(f'Total time elapsed: {t2-t1:0.2f} seconds')
我们有三个任务在随机秒数内完成。通过这种方式,我们模拟了三个不同的长时间运行任务的执行。
async def main(): for x in range(2): await asyncio.gather(task1(), task2(), task3()) print('----------------------------')
主要功能集合了所有三个任务。它也是一个协程,用async
装饰。我们使用await
关键字等待asyncio.gather
的结果。
$ python simple3.py task 2 finished task 1 finished task 3 finished ---------------------------- task 3 finished task 2 finished task 1 finished ---------------------------- Total time elapsed: 8.01 seconds
在本文中,我们使用了Python中的async/await关键字。
列出所有Python教程。