Как запустить функцию в фоновом режиме, чтобы она не останавливала работу других страниц django

У меня есть скрипт, который начинает загрузку звукового файла, когда пользователь нажимает кнопку на сайте, но когда один пользователь начинает загрузку, весь бэкенд останавливается и ждет, пока она не закончится, прежде чем любой другой пользователь сможет воспользоваться сайтом.

songList = await self.getSongs()
            await self.downloadSongs(songList)
            

async def downloadSongs(self, songList):
    dirList = os.listdir("Directory")
    await self.channel_layer.group_send(
        self.room_group_name,
        {
            'type': 'loadingGameGroup',
        })
    downloadThread = threading.Thread(target=self.download, args=(songList, dirList))
    downloadThread.start()
    downloadThread.join()

def download(self, songList, dirList):
    for song in songList:
        try:
            self.downloadSong(song, dirList)
        except:
            self.downloaded = False
            return

def downloadSong(self, song, dirList):
    songId = song["song_id"]
    if songId + ".mp3" in dirList:
        return
    video_url = "https://www.youtube.com/watch?v="+ songId
    video_info = youtube_dl.YoutubeDL().extract_info(
        url = video_url,download=False
    )
    filename = "Directory" + songId + ".mp3"
    options={
        'format':'bestaudio/best',
        'keepvideo':False,
        'outtmpl':filename,
    }
    with youtube_dl.YoutubeDL(options) as ydl:
        ydl.download([video_info['webpage_url']])

Как сделать так, чтобы он загружал песни, ждал, пока одна группа песен закончит, чтобы я мог отправить сообщение websocket обратно клиенту, чтобы тот мог продолжить. В то время как другим группам не нужно ждать окончания загрузки, чтобы что-то сделать

Задача, стоящая перед вами, упрощается при использовании таких пакетов, как RabbitMQ или celery, По сути, вы будете создавать множество отдельных рабочих, которые будут принимать задания из вашей загружаемой queue, я рекомендую использовать RabbitMQ для этого, поскольку celery может быть немного сложным.

https://www.rabbitmq.com/tutorials/tutorial-one-python.html

Если вы хотите использовать для этого обычный django сервер, то он просто не будет работать из-за природы веб-страниц.

Вернуться на верх