参考:
- 并发:并发基本概念
python 使用 async
和 await
语法的东西来写”异步代码“。
import asyncio
import httpxasync def fetch_baidu():url = "https://www.baidu.com"async with httpx.AsyncClient() as client:try:response = await client.get(url)# 检查请求是否成功(HTTP状态码200表示成功)if response.status_code == 200:print("请求成功!")# 可以打印网页内容的前100个字符预览print(response.text[:100])else:print(f"请求失败,状态码:{response.status_code}")except httpx.RequestError as e:print(f"请求过程中发生错误: {e}")async def main():await fetch_baidu()if __name__ == "__main__":asyncio.run(main())
定义了一个异步函数 fetch_baidu
,它使用 httpx.AsyncClient()
发起异步HTTP GET请求到百度。async with
语句确保了客户端在请求完成后会被正确关闭。await
关键字用于等待异步操作(这里是网络请求)完成。main
函数中通过 await fetch_baidu()
异步调用该函数,最后通过 asyncio.run(main())
启动事件循环并执行异步任务。
并发(Concurrency)是指在计算机系统中同时处理多个任务的能力。这个“同时”并不一定意味着这些任务是真正的同时执行(即并行,Parallelism),而是指在一段时间内,这些任务的执行是交错进行的,系统在不同任务之间快速切换,给予每个任务一定的执行时间片,从而让用户感觉到多个任务在同时进行。
在操作系统和编程领域,并发可以体现为以下几个关键特点:
-
任务重叠:在一段时间窗口内,多个任务的部分执行阶段是重叠的。这不一定意味着它们在物理上是同时执行的,但至少从宏观层面来看,它们的执行是交错的。
-
资源共享:并发任务经常需要访问共享资源,如内存、文件或数据库,这要求系统提供适当的同步机制来防止数据不一致性或竞态条件等问题。
-
上下文切换:为了实现并发,处理器需要在不同任务之间切换执行上下文,保存和恢复各个任务的状态信息,确保每个任务都能从上次中断的地方继续执行。
-
非确定性:并发执行可能导致程序的行为变得难以预测,因为任务的执行顺序、完成时间可能受到许多因素的影响,包括任务调度策略、资源可用性等。
并发可以借助多线程、多进程、异步IO、协程等多种技术实现