gpt4 book ai didi

python - 开始学习新的 Python 3.5 Asyncio(协程)的好地方 | Discord.py BOT 崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 02:56:40 25 4
gpt4 key购买 nike

因此,我似乎没有找到任何关于在 python 中使用新的 asyncio 模块(async、await 等)的好教程。此外,从我看过的所有教程来看,这个概念描述得很差,我似乎无法理解协程的概念。我的意思是,这个概念背后的想法并不难,但没有一个地方可以让我准确了解协程可以做什么和不能做什么,以及如何使用它们。

例如,我为目前正在构建的 Discord BOT 编写了一个名为 YouTubeAPI 的小类。 Discord.py 库的所有功能都使用 asyncio,但我的类(class)没有。我的类(class) (YouTubeAPI) 的唯一目的是从 YouTube 数据 API V3 中检索有关用户发布的最新视频的数据。实际上,我正在尝试构建一个 BOT,让我了解某人发布的所有视频的最新信息。

但为了让 BOT 正常工作,我需要制作一个 update() 函数来定期获取所有视频,以便我可以获得最新的视频。问题是更新函数需要包含在 while True 循环(或类似的东西)中,这样我才能使列表保持最新。如果我构建一个无限循环,那么我将遇到 BOT 问题(导致 BOT 崩溃和无法使用)。

所以,我想也许我可以学习新的 asyncio 模块并以这种方式解决问题。遗憾的是我什么也没找到。

下面是一些删除了所有 API key 的代码,这样您就可以更容易地看到我的问题:

from Api_Test import YoutubeAPI
import discord
import asyncio

YoutubeName = 'Vsauce'
GOOGLE_API = 'API KEY'

print('Collecting YouTube Data.')
api = YoutubeAPI(GOOGLE_API, YoutubeName) # create object that will get all info for the name 'Vsauce'
print('YouTube Data collected succesfully.')
print('Starting bot.')

def getLastVideo():
return api.videosData[0] # api.videosData looks like: [[title, link],[title, link],[title, link],]

client = discord.Client()

@client.event
async def on_ready():
print('Logged in as')
print(client.user.name)
print(client.user.id)
print('------')
await client.send_message('Now testing: Last {} videos!'.format(YoutubeName))


#While Loop that keeps the api.videosData up-to-date and runs "await client.send_message('new video: title + ink')" if new video found in the list

client.run('Discord BOT token')

如果这篇文章的解释听起来含糊不清,我感到非常抱歉,但我完全不知道如何使用 asyncio 或类似的东西,而且我发现自己处在一个几乎找不到关于这个新概念的文档的地方。

最佳答案

您可以使用 ensure_future() 来运行您的 while 循环。这里的循环在 on_ready 被调用时开始并运行直到 bot 关闭

@client.event
async def on_ready():
print('Logged in as')
print(client.user.name)
print(client.user.id)
print('------')
await client.send_message('Now testing: Last {} videos!'.format(YoutubeName))

asyncio.ensure_future(update_data(), client.loop) # Starts the infinite loop when the bot starts

async def update_data():
while True:
# Do the things you need to do in this loop
await asyncio.sleep(1) # sleep for 1 second

client.run('Discord BOT token')

关于python - 开始学习新的 Python 3.5 Asyncio(协程)的好地方 | Discord.py BOT 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42147092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com