Очень медленный бот Discord для воспроизведения музыки

Я пишу бота 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 ответ
1

  • Предпочитайте отступ в четыре пробела вместо сочетания четырех и двух
  • queueurls должно быть queue_urls
  • else / pass избыточен и может быть удален
  • Использование одного временного файла со статическим именем для воспроизведения — не лучшая идея. Вместо этого используйте временный файл чтобы сгенерировать случайное одноразовое временное имя файла. Вполне возможно, что наблюдаемая вами неэффективность на самом деле является своего рода спором вокруг вашего единственного имени файла.
  • while queueurls != [] лучше сформулировать как while len(queue_urls) > 0.
  • while vcs.is_playing это цикл опроса, который, вероятно, приведет к перегрузке вашего процессора. По крайней мере, добавьте sleep(0.1) внутрь вашего цикла, чтобы освободить поток от планировщика ОС. Еще лучше было бы заблокировать вызов вашей аудиотеке, хотя я не знаю, возможно ли это. На основе документация, вы можете подождать, пока after хук финализатора называется.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *