Я пишу бота discord.py, работающего на replit.com. Я перешел к части музыкального бота после завершения части очереди. Мой код логически правильный; однако код слишком неэффективен, что приводит к сбою бота, когда кто-то добавляет другую песню в очередь. Как я могу запрограммировать моего бота, чтобы он был более эффективным? Если мой код должен быть совершенно другим, было бы полезно короткое объяснение.
Код для игры:
@bot.command(name="play", aliases=['sing', 'p'])
async def _play(ctx, url : str):
queueurls = [] #list with the urls
vc = ctx.voice_client
if not vc:
channel = ctx.author.voice.channel
await channel.connect()
url = ctx.message.content
url = ttourl(url) #the message is processed to an url
queueurls.append(url) #add the url to the list
voicec = ctx.voice_client
if not voicec.is_playing(): #when nothing is going on
while queueurls != []: #as long as the url list isn't empty I want the process to repeat
voice = discord.utils.get(bot.voice_clients, guild=ctx.guild)
url = queueurls[0] #url is the first item in the list
queueurls.pop(0) #now erase the now used first item (url)
with youtube_dl.YoutubeDL(ytdlopts) as ydl:
ydl.download([url]) #download the song
voice.play(discord.FFmpegPCMAudio("songstemp/song.mp3")) #play the song
vcs = ctx.voice_client
while vcs.is_playing: #wait for the song to be over
continue
if os.path.exists("songstemp/song.mp3"):
path = "songstemp/song.mp3"
os.remove(path)
else: #if the bot is already playing, then don't disturb the loops above
pass
1 ответ
- Предпочитайте отступ в четыре пробела вместо сочетания четырех и двух
queueurlsдолжно бытьqueue_urlselse / passизбыточен и может быть удален- Использование одного временного файла со статическим именем для воспроизведения — не лучшая идея. Вместо этого используйте временный файл чтобы сгенерировать случайное одноразовое временное имя файла. Вполне возможно, что наблюдаемая вами неэффективность на самом деле является своего рода спором вокруг вашего единственного имени файла.
while queueurls != []лучше сформулировать какwhile len(queue_urls) > 0.while vcs.is_playingэто цикл опроса, который, вероятно, приведет к перегрузке вашего процессора. По крайней мере, добавьтеsleep(0.1)внутрь вашего цикла, чтобы освободить поток от планировщика ОС. Еще лучше было бы заблокировать вызов вашей аудиотеке, хотя я не знаю, возможно ли это. На основе документация, вы можете подождать, покаafterхук финализатора называется.
