并发是在同一个处理器上,任务交替运行(趁别的任务等待或者IO操作的时候先运行其他任务),某一时刻只有一个任务运行;侧重于资源共享和任务调度,目的是提高系统的响应效率,;
并行是在不同处理器上,任务同时运行来减少总时间,某一时刻可以有多个任务在不同的硬件上运行;侧重于充分利用硬件资源,目的是提高系统的计算性能。
异步指的是一种编程模式,在这种模式下,任务可以独立地执行并且不会阻塞主线程。异步编程常用于I/O操作、事件驱动等场景,可以提高系统的响应能力和资源利用率。异步编程通常需要使用回调函数、事件监听、Future/Promise等异步编程机制。
使用异步编程处理api请求,可以向大模型发送多个查询,不必等待一个查询完成后再发送。可以提高效率,减少等待时间,提高用户交互体验的流畅性。
协程:一个协程遇到 I/O 操作时,它会主动让出控制权,让其他协程得以执行。当 I/O 操作完成时,该协程会被唤醒继续执行,适合于I/O密集型的应用程序,提高并发性能。
异步网络请求:
1 import asyncio #导入 Python 的异步编程库 asyncio,用于创建和管理异步任务。
2 import aiohttp# 导入 aiohttp 库,用于发送 HTTP 请求和获取网页内容。
3 import time
4 async def fetch_url(url): #: 定义一个名为 fetch_url 的异步函数,
async with aiohttp.ClientSession() as session: #async 关键字创建协程,一个 aiohttp 客户端会话,用于发送 HTTP 请求,async with 确保会话在函数退出时自动关闭
async with session.get(url) as response: # 使用客户端会话发送一个 GET 请求到指定的 URL,并获取响应对象
return await response.text() #从响应中读取页面内容,并返回结果。await 关键字暂停协程。
8 async def main(): #定义一个名为 main 的异步函数,作为程序的入口点。
9 start = time.time()
urls = ["http://example.com",
10 "http://example.org", "http://example.net"]
11 tasks = [fetch_url(url) for url in urls]
12 pages = await asyncio.gather(*tasks) #处理获取的页面数,使用 asyncio.gather 函数并发地执行所有异步任务,并等待它们全部完成。显著提高速度和吞吐量
for page in pages:
print(len(page))
end = time.time()
ptrint('running time:%s seconds'%(end-start))
13 asyncio.run(main()) #启动 main 函数,运行整个异步程序
异步函数库 asyncio 同步函数库 requests
def fetch_url(url):
reponse = request.get(url)
return response.test
异步能够同时发起多个网络请求,在等待其中 一个的时候,处理其他请求
同步是每个请求顺序发起,必须等待当前请求完成后才能开始下一个请求
async def square(number:int) ->int:
return number*number
result = square(10) #返回的是一个协程对象,必须要创建协程事件循环并关闭事件循环
print(result)
result = asyncio.run(square(10)) #asyncio.run() 自动创建协程事件循环并关闭事件循环,是程序的主要入口
print(result)
await +协程对象A:暂停协程的关键字,只在协程内部有效,暂停A协程等待A返回结果
记录时间
time.time() #都是计时,这个受系统时间影响 比如时区从北京调到洛杉矶
time.perf_counter() #不受系统时间影响
await asyncio.sleep(2) #暂停协程等待两秒,这个协程挂起,先去执行其他2秒
asyncio.gather()让多个协程任务并发执行,不用手动创建任务,异常管理、取消任务
xxx = future () 是将来返回值的对象,现在还没有被赋值,可以用xxx.done()查询是否赋值
在异步方法中,顺序调用不代表顺序执行,异步函数返回的是一个异步对象,不会直接执行,添加到asyncio.gather才被调用执行,并发执行这些协程