浅谈Python协程asyncio
什么是协程
协程是一种用户态的轻量级线程,它比线程更加的轻量级,占用系统资源更少,利用协程可以写出异步非阻塞的代码。Python中的协程是通过生成器实现的。
什么是asyncio
Python标准库中提供了asyncio模块用于支持异步io操作,asyncio实现了事件循环(Event Loop),协程和任务(Task)三个抽象概念。事件循环是异步IO的核心,协程是任务的执行单元,任务则是使用协程定义的,由事件循环调度执行。
asyncio采用了单线程的方式进行开发,保证了在同一时刻只有一个协程在执行,这也避免了并发访问共享数据时的线程安全问题。
以下是一个简单的协程示例,通过async和await关键字可以实现异步非阻塞调用:
import asyncio
async def task():
print("Task running...")
await asyncio.sleep(1)
print("Task done!")
async def main():
task1 = asyncio.create_task(task())
task2 = asyncio.create_task(task())
await task1
await task2
asyncio.run(main())
在上面的示例中,task()
函数是一个协程函数,使用async
关键字定义。异步操作可以通过使用await
关键字来实现,await asyncio.sleep(1)
表示让当前的任务等待1秒。在main()
函数中,使用asyncio.create_task()
来创建两个协程任务,然后通过await
等待任务执行结束。
asyncio中的常用工具
asyncio.gather()
asyncio.gather()
方法可以同时运行多个协程任务,并且在所有任务结束后进行汇总。下面是一个使用asyncio.gather()
的示例:
import asyncio
async def task1():
print("Task1 running...")
await asyncio.sleep(1)
print("Task1 done!")
return "Task1 result"
async def task2():
print("Task2 running...")
await asyncio.sleep(2)
print("Task2 done!")
return "Task2 result"
async def main():
results = await asyncio.gather(task1(), task2())
print(results)
asyncio.run(main())
在上面的示例中,task1()
和task2()
是两个协程任务。asyncio.gather(task1(), task2())
会同时运行这两个任务,等待它们执行完成之后进行汇总,输出的结果为:
Task1 running...
Task2 running...
Task1 done!
Task2 done!
['Task1 result', 'Task2 result']
asyncio.wait()
asyncio.wait()
方法可以在多个协程任务运行时,等待其中一个任务完成后再继续运行其他任务。下面是一个使用asyncio.wait()
的示例:
import asyncio
async def task1():
print("Task1 running...")
await asyncio.sleep(1)
print("Task1 done!")
return "Task1 result"
async def task2():
print("Task2 running...")
await asyncio.sleep(2)
print("Task2 done!")
return "Task2 result"
async def main():
tasks = [task1(), task2()]
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
print(done.pop().result())
print(pending)
asyncio.run(main())
在上面的示例中,task1()
和task2()
是两个协程任务。使用tasks = [task1(), task2()]
定义任务列表,然后使用asyncio.wait()
方法异步运行所有任务,return_when=asyncio.FIRST_COMPLETED
表示在任意一个任务完成时就返回,这里是等待第一个任务完成。done
是已完成的任务列表,pending
是未完成的任务列表。输出的结果为:
Task1 running...
Task2 running...
Task1 done!
Task1 result
{<Task pending coro=<task2() running at test.py:10>>}
总结
Python的asyncio提供了一种非阻塞异步编程方式,能够提高程序的并发性和性能表现。通过使用协程,可以让代码更具可读性和维护性。同时,asyncio提供了一些常用工具函数,如asyncio.gather()
和asyncio.wait()
,可以在协程任务中灵活运用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Python协程asyncio - Python技术站