Python asyncio.gather搭配shazamio使用时无法并发执行问题
问题根因
你当前代码全局只创建了一个Shazam()实例,shazamio库的单实例内部维护了独立的请求会话、音频数据缓存和执行锁,多个协程共用同一个实例时,会被内部锁强制串行执行;同时实例内的音频数据缓存会被所有任务共享,后续任务会读取到前一个任务加载的音频内容,最终出现所有任务返回同一条识别结果、总耗时接近单任务耗时累加的现象。
修复方法
不要全局共用单个Shazam实例,在每个识别任务内部初始化独立的Shazam对象即可,修改后的可运行代码如下:
from shazamio import Shazam import asyncio files = [ './0.mp3', './1.mp3', './2.mp3', ] async def recognise_one_song(name): # 为每个识别任务单独创建Shazam实例,避免状态共享和锁冲突 shazam = Shazam() print(name) song = await shazam.recognize_song(name) if song.get('track') is not None: print(f"{song['track']['title']}\t{song['track']['subtitle']}") async def recognise_all_songs(files): tasks = [recognise_one_song(file) for file in files] await asyncio.gather(*tasks) asyncio.run(recognise_all_songs(files))
效果说明
- 修复后3首音频的总识别耗时会和单首识别耗时基本持平(约8-10秒),实现真正的并发执行
- 各任务的实例状态完全隔离,不会再出现多文件返回相同识别结果的错误
- 如果批量识别的文件数量较多,可以搭配
asyncio.Semaphore控制最大并发数,避免请求频率过高触发Shazam接口的限流规则
内容的提问来源于stack exchange,提问作者Abdul Rehman
相关产品推荐
相关产品推荐

