线程间存在结果依赖时如何运行多线程(含Python异步代码场景)
代码执行流程优化方案
最高收益优化:移除冗余调用
你现有代码中await yt_client.PlaySongByLink()的返回值download_link_attempt未在后续逻辑中使用,如果该调用没有必须的初始化副作用(无需通过它初始化客户端内部属性),直接删除该行即可砍掉这一步的全部网络IO耗时:
yt_client = SoundHandler.YouTube(search=search) search_url = yt_client.SearchURL() source, video_url = await yt_client.GetTopSearchResultAudioSource(search_url) yt_info, yt_info_embed = await yt_client.GetYouTubeInformation(video_url)
次优优化:并行无依赖异步任务
如果PlaySongByLink()必须保留,且该方法执行不需要依赖后续搜索流程的输出,可通过asyncio.gather将其和搜索+信息获取的流程并行执行,总耗时为两个任务中耗时更长的那个,而非两者累加:
import asyncio yt_client = SoundHandler.YouTube(search=search) search_url = yt_client.SearchURL() # 封装有依赖关系的搜索流程 async def search_pipeline(): source, video_url = await yt_client.GetTopSearchResultAudioSource(search_url) yt_info, yt_info_embed = await yt_client.GetYouTubeInformation(video_url) return source, video_url, yt_info, yt_info_embed # 并行执行两个无依赖的异步任务 download_link_attempt, (source, video_url, yt_info, yt_info_embed) = await asyncio.gather( yt_client.PlaySongByLink(), search_pipeline() )
额外优化:减少重复网络请求
检查GetTopSearchResultAudioSource的返回结果,大部分YouTube搜索接口会在搜索结果中直接返回视频标题、时长、封面、作者等基础信息,如果和GetYouTubeInformation需要获取的字段一致,可直接在前者中解析对应字段返回,无需单独调用后者发起二次请求,可再减少一次网络IO耗时。
其他可选优化
- 对常用搜索关键词、视频信息做本地缓存,重复请求时直接返回缓存结果
- 如果
SearchURL方法内部存在IO操作而非本地字符串拼接,可将其改造为异步方法,和其他异步任务并行执行
内容的提问来源于stack exchange,提问作者Jaxon. B
相关产品推荐
相关产品推荐

