Python如何实现无需等待函数执行完成就继续后续操作?
解决方案
你需要实现IO密集型任务的并发执行,网络请求场景下大部分耗时都在等待响应返回,用多线程或者协程都可以实现无需等待当前请求完成就推进后续任务的效果,以下是两种可直接使用的实现方案:
方案1:多线程实现(新手友好,改动最小)
不用大幅修改原有逻辑,用Python内置的concurrent.futures.ThreadPoolExecutor即可实现:
import requests from concurrent.futures import ThreadPoolExecutor def check(link): # 新增超时参数,避免单个请求异常卡死整个程序 response = requests.get(link, timeout=10) print(response.text) # 替换为你实际要处理的链接列表,注意不要用list作为变量名,会覆盖Python内置类型 link_list = [] # 最大并发数,可根据实际需求调整,常规爬取场景设置10-50都可以 MAX_WORKERS = 20 if __name__ == '__main__': with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: # 批量提交所有任务给线程池调度执行 executor.map(check, link_list)
说明
- 原有串行代码每次都要等前一个请求的响应完全返回后才会处理下一个链接,大部分时间处于空闲等待状态
- 多线程模式下,某个线程等待网络响应时会自动调度其他线程执行新的请求,不会出现空等的情况,处理速度会有数十倍的提升
方案2:协程实现(性能更高,适合大批量链接处理)
如果需要同时处理成百上千个链接,协程的资源开销比线程更小,性能更高,需要搭配异步HTTP库aiohttp使用:
import asyncio import aiohttp async def check(link, session): async with session.get(link, timeout=10) as response: text = await response.text() print(text) # 替换为你实际要处理的链接列表 link_list = [] async def main(): async with aiohttp.ClientSession() as session: # 批量生成异步任务,同时执行 tasks = [check(link, session) for link in link_list] await asyncio.gather(*tasks) if __name__ == '__main__': asyncio.run(main())
说明
- 注意不要在协程逻辑中直接使用同步的
requests库,会阻塞协程调度,必须换成异步HTTP库 - 协程模式下单进程就能支持上千并发,资源占用远低于多线程方案
内容的提问来源于stack exchange,提问作者cecokem614
相关产品推荐
相关产品推荐

