You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:21:28