Python中的asyncio(异步I/O)是一种高效的编程方式,可以极大地提高程序的并发能力。下面是python中asyncio异步编程学习的完整攻略:
1. 了解异步编程的概念和特点
异步编程是一种非阻塞的编程方式,与传统的同步阻塞编程方式不同。它可以在同一线程上运行多个任务,并且允许一个任务在等待某些操作完成时执行其他任务,从而最大程度地发挥计算资源的利用效率。Python官方自3.5版本起,默认提供了对asyncio的支持。
异步编程的特点:
-
响应更快:在网络通信等I/O密集型任务中,等待网络数据传输或磁盘读取的时间可能会很长,使用异步编程可以让执行流转向等待时间更少的任务,从而能够更快地执行程序。
-
提高并发:在多任务执行时,异步编程可以利用同一线程运行多个协程,分别处理各自的任务。
2. asyncio常用的函数及使用
在使用asyncio时,我们需要使用一些函数来控制协程的执行和等待,以下是是常用的几个函数。
-
async def 特殊的声明:使用async声明的函数可以被视为coroutine对象,存在于协程对象之中。await语句能够在协程中挂起当前协程,等待另一协程完成后继续执行。
-
asyncio.create_task(func, args, *kwargs):创建并且调度一个协程任务,返回一个Task对象。
-
asyncio.gather(aws, loop=None, *kw):并行运行多个协程,并在所有协程结束时返回一个由所有协程返回值组成的列表。
下面是一个示例代码,演示利用asyncio来进行多任务异步并发请求:
import random
import asyncio
import aiohttp
async def get(session, url):
async with session.get(url) as response:
return await response.text()
async def fetch(urls):
async with aiohttp.ClientSession() as session:
tasks = []
for url in urls:
tasks.append(asyncio.create_task(get(session, url)))
gathered = await asyncio.gather(*tasks)
print(gathered)
urls = [f'http://example.com/api/{x}' for x in range(5)]
asyncio.run(fetch(urls))
以上代码中,我们使用async def声明了get函数,使用了aiohttp模块来发出异步请求,fetch函数创建了多个task对象并汇总等待执行结果。
3. asyncio中的同步代码
在日常编程中,依然有大量场景需要同步处理,此时我们可以使用asyncio.create_task方法把一个同步函数包装成协程进行使用。下面是一个示例代码,演示asyncio中如何调用同步函数:
import asyncio
def sync_hello():
return "Hello, World!"
async def async_hello():
# asyncio.ensure_future方法等价于asyncio.create_task方法,将同步函数包装成协程执行
result = await asyncio.ensure_future(sync_hello())
print(result)
asyncio.run(async_hello())
在以上代码中,我们通过使用asyncio.ensure_future方法来包装同步函数,使其能够在协程中使用。此外,在协程中我们使用了await关键字来等待同步函数执行的结果,从而获得了同步代码在异步程序中的使用方式。
以上就是Python中asyncio异步编程的完整攻略,包含异步编程的概念、特点,以及用法示例,希望可以帮助到大家。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中asyncio异步编程学习 - Python技术站