性能测试说明测试内容连续发起20次HTTP请求分别测试同步串行 requests多线程并发 requests协程异步 aiohttp统一目标地址控制超时统计总耗时直观对比差距。完整测试代码importtimeimportthreadingimportrequestsimportasyncioimportaiohttp# 配置TEST_URLhttps://httpbin.org/getREQUEST_COUNT20TIMEOUT5# ---------------------- 1. 同步串行请求 ----------------------defsync_request():starttime.time()sessionrequests.Session()for_inrange(REQUEST_COUNT):try:session.get(TEST_URL,timeoutTIMEOUT)exceptException:passcostround(time.time()-start,2)print(f【同步串行】{REQUEST_COUNT}次请求总耗时{cost}s)# ---------------------- 2. 多线程 requests 并发 ----------------------defthread_fetch():try:requests.get(TEST_URL,timeoutTIMEOUT)exceptException:passdefthread_request():starttime.time()tasks[]for_inrange(REQUEST_COUNT):tthreading.Thread(targetthread_fetch)tasks.append(t)t.start()fortintasks:t.join()costround(time.time()-start,2)print(f【多线程并发】{REQUEST_COUNT}次请求总耗时{cost}s)# ---------------------- 3. 异步 aiohttp 并发 ----------------------asyncdefasync_fetch(session):try:awaitsession.get(TEST_URL,timeoutaiohttp.ClientTimeout(totalTIMEOUT))exceptException:passasyncdefasync_main():asyncwithaiohttp.ClientSession()assession:tasks[async_fetch(session)for_inrange(REQUEST_COUNT)]awaitasyncio.gather(*tasks)defasync_request():starttime.time()asyncio.run(async_main())costround(time.time()-start,2)print(f【异步协程】{REQUEST_COUNT}次请求总耗时{cost}s)if__name____main__:sync_request()thread_request()async_request()预期运行结果参考【同步串行】20次请求总耗时6.85 s 【多线程并发】20次请求总耗时0.72 s 【异步协程】20次请求总耗时0.65 s补充版本限制并发数量更贴近真实业务真实项目不会无限并发我们加上并发上限对比效果更真实importtimeimportasyncioimportaiohttp TEST_URLhttps://httpbin.org/getREQUEST_COUNT20MAX_CONCURRENT5# 限制最大并发量asyncdeflimited_fetch(session,sem):asyncwithsem:try:awaitsession.get(TEST_URL,timeoutaiohttp.ClientTimeout(total5))exceptException:passasyncdefmain():semasyncio.Semaphore(MAX_CONCURRENT)asyncwithaiohttp.ClientSession()assession:tasks[limited_fetch(session,sem)for_inrange(REQUEST_COUNT)]awaitasyncio.gather(*tasks)if__name____main__:stime.time()asyncio.run(main())print(f限制{MAX_CONCURRENT}并发总耗时{round(time.time()-s,2)}s)总结对比同步串行总时间 ≈ 单次耗时 × 请求总数最慢多线程利用多线程等待IO速度大幅提升但是线程创建有开销异步协程轻量级调度无线程开销连接池复用TCP同等并发下速度略优于多线程内存占用更低。需要我把这段测试代码整理成博客正文版本吗
同步请求和异步请求的性能测试代码
发布时间:2026/6/28 7:12:58
性能测试说明测试内容连续发起20次HTTP请求分别测试同步串行 requests多线程并发 requests协程异步 aiohttp统一目标地址控制超时统计总耗时直观对比差距。完整测试代码importtimeimportthreadingimportrequestsimportasyncioimportaiohttp# 配置TEST_URLhttps://httpbin.org/getREQUEST_COUNT20TIMEOUT5# ---------------------- 1. 同步串行请求 ----------------------defsync_request():starttime.time()sessionrequests.Session()for_inrange(REQUEST_COUNT):try:session.get(TEST_URL,timeoutTIMEOUT)exceptException:passcostround(time.time()-start,2)print(f【同步串行】{REQUEST_COUNT}次请求总耗时{cost}s)# ---------------------- 2. 多线程 requests 并发 ----------------------defthread_fetch():try:requests.get(TEST_URL,timeoutTIMEOUT)exceptException:passdefthread_request():starttime.time()tasks[]for_inrange(REQUEST_COUNT):tthreading.Thread(targetthread_fetch)tasks.append(t)t.start()fortintasks:t.join()costround(time.time()-start,2)print(f【多线程并发】{REQUEST_COUNT}次请求总耗时{cost}s)# ---------------------- 3. 异步 aiohttp 并发 ----------------------asyncdefasync_fetch(session):try:awaitsession.get(TEST_URL,timeoutaiohttp.ClientTimeout(totalTIMEOUT))exceptException:passasyncdefasync_main():asyncwithaiohttp.ClientSession()assession:tasks[async_fetch(session)for_inrange(REQUEST_COUNT)]awaitasyncio.gather(*tasks)defasync_request():starttime.time()asyncio.run(async_main())costround(time.time()-start,2)print(f【异步协程】{REQUEST_COUNT}次请求总耗时{cost}s)if__name____main__:sync_request()thread_request()async_request()预期运行结果参考【同步串行】20次请求总耗时6.85 s 【多线程并发】20次请求总耗时0.72 s 【异步协程】20次请求总耗时0.65 s补充版本限制并发数量更贴近真实业务真实项目不会无限并发我们加上并发上限对比效果更真实importtimeimportasyncioimportaiohttp TEST_URLhttps://httpbin.org/getREQUEST_COUNT20MAX_CONCURRENT5# 限制最大并发量asyncdeflimited_fetch(session,sem):asyncwithsem:try:awaitsession.get(TEST_URL,timeoutaiohttp.ClientTimeout(total5))exceptException:passasyncdefmain():semasyncio.Semaphore(MAX_CONCURRENT)asyncwithaiohttp.ClientSession()assession:tasks[limited_fetch(session,sem)for_inrange(REQUEST_COUNT)]awaitasyncio.gather(*tasks)if__name____main__:stime.time()asyncio.run(main())print(f限制{MAX_CONCURRENT}并发总耗时{round(time.time()-s,2)}s)总结对比同步串行总时间 ≈ 单次耗时 × 请求总数最慢多线程利用多线程等待IO速度大幅提升但是线程创建有开销异步协程轻量级调度无线程开销连接池复用TCP同等并发下速度略优于多线程内存占用更低。需要我把这段测试代码整理成博客正文版本吗