Python:需要在不中断循环的情况下调用API

问题描述 投票:0回答:1

我有一个用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,并留下您想要的任何评论或批评。 (只知道这是我的第一个主要项目,所以我不了解代码或github / stack溢出礼节大声笑。)

我有一个用Python编写的程序,该程序使用Spotify库调用Spotify API来获取用户当前正在播放的歌曲以及相关歌曲的速度。然后,它将使用该信息,...

python spotify firmata
1个回答
0
投票

是的,因为您有一个“ while True”表示主循环,并且更改的变量只写在一侧,而另一侧则可以读取,所以可以移植为轻松使用异步或线程。

[在多线程中,您会同时在单独的线程中连续运行pin发送函数和api读取函数-就您所关心的它们并行运行而言-并且在Python中有些普通变量是线程安全的,也就是说这就是全部。

© www.soinside.com 2019 - 2024. All rights reserved.