1.aiohttp基本用法:
async def get_html(url):
timeout = aiohttp.ClientTimeout(total=2) #设置超时时间
proxy = ""
async with aiohttp.ClientSession(headers=headers, timeout=timeout) as session:
async with session.get(url, params=params, proxy=proxy) as response:
print("res:", await response.text())
if __name__ == '__main__':
url = ''
loop = asyncio.get_event_loop()
loop.run_until_complete(get_html(url))
#在python3.7及以上的版本中 推荐使用asyncio.run() 的方式直接启动协程,不用显式的创建事件循环
#这里提示一下,很多初学者可能会遇到的问题:python文件名与导入的模块名冲突,导致不能使用模块中的方法。
2.另一种启动协程的方式:
在创建事件循环的时候,我们可以显式的创建任务,然后注册到事件循环当中执行。具体代码如下:
tasks = [asyncio.ensure_future(get_html(url) for i in range(1000))]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
3.asyncio.wait的用法及一些解释
在Python的asyncio
库中,asyncio.wait
是一个低级别的用于等待asyncio
任务(Task)完成的函数。它用于并发运行多个协程,并在它们完成时提供更细粒度的控制。当你有多个异步操作需要同时执行,并且你想在它们完成后做一些处理时,这个函数非常有用。
使用asyncio.wait:
asyncio.wait
接受一个由asyncio
任务或协程组成的集合(通常是一个set),并返回两个集合:一个是已完成的任务集合,另一个是未完成的任务集合。它允许你指定多个不同的选项来控制其行为,例如设置超时时间,以及控制何时返回。
基本语法如下:
done, pending = await asyncio.wait(tasks, timeout=None, return_when=ALL_COMPLETED)
tasks
:一个由asyncio
任务或协程对象组成的集合。timeout
:可选参数,指定等待所有任务完成的最大秒数。return_when
:决定asyncio.wait
何时返回。它可以是asyncio.ALL_COMPLETED
(默认值,等待所有任务完成)、asyncio.FIRST_COMPLETED
(第一个任务完成时返回)或asyncio.FIRST_EXCEPTION
(第一个任务抛出异常时返回)。
4.asyncio.gather
asyncio.gather
是Python中asyncio
库提供的一个高级接口,用于并发运行多个异步可等待对象(通常是协程),并在它们全部完成时收集所有结果。与asyncio.wait
相比,gather
更高级、使用起来更简单直观,特别是当你需要所有任务的返回结果时。
使用asyncio.gather
基本语法如下:
results = await asyncio.gather(*tasks, return_exceptions=False)
*tasks
:一个或多个异步可等待对象,如协程。return_exceptions
:可选参数,默认为False
。如果设置为True
,则异常会被正常返回而不是抛出,这样你可以在结果中区分成功和失败的任务。
asyncio.gather
会等待传入的所有任务完成,并按照传入任务的顺序返回一个包含所有结果的列表。如果任何一个任务抛出异常,gather
将会取消所有其他任务(除非return_exceptions=True
)并将异常向上抛出。