我有一个我用 Python 编写的程序,它使用 Spotipy 库调用 Spotify API 来获取用户当前正在播放的歌曲和相关歌曲的节奏。然后它使用该信息、串行连接和 Arduino 来运行一些灯。
我遇到的问题是我希望程序定期检查 API,看看歌曲是否发生了变化,但是每个 API 调用都会占用我的网络大约 0.15 秒,所以在没有太多调用之后它会搞砸灯的时间。
这是调用速度 API 的函数和一个示例 while 循环。如果你想查看完整的项目和完整的代码,这里是 github 的链接 - https://github.com/eboyce452/lightshow.git:
def check_bpm():
global seconds_per_beat
global current_track
current_track = spotify.current_user_playing_track()
if current_track is None:
seconds_per_beat = 0.5
else:
current_track = json_normalize(current_track)
current_track = str(current_track['item.id'].iloc[0])
features = json_normalize(spotify.audio_features(current_track))
tempo = float(features['tempo'].iloc[0])
seconds_per_beat = 60/tempo
while True:
check_bpm()
pin2.write(1)
time.sleep(seconds_per_beat)
pin2.write(0)
time.sleep(seconds_per_beat)
因此,在一个完美的世界中,我正在寻找一种让 check_bpm() 函数在后台运行的方法,以便灯光可以保持在节拍状态,然后当歌曲发生变化时,让循环中断(使用像 continue 或其他东西)和 seconds_per_beat 的变量被更新。
我真的不知道这是否可能,所以请随意权衡。但我最好奇的是实现一种常见的并发形式,这样当 check_bpm() 函数正在等待 API 调用完成时,它会继续执行 while 循环的其余部分,这样灯就不会熄灭的同步。我已经阅读了很多关于 asyncio 的内容,但是我对它非常陌生,因此可以提供任何帮助,我们将不胜感激。
太感谢了!随时查看该项目的 github,并留下您想要的任何评论或批评。